django rest framework 向数据库中插入数据时处理外键的方法

一.models.py中

from django.db import models

class UserModel(models.Model)
    user_name = models.CharField()

class MyModel(models.Model)
    author = models.Foreignkey(user)
    age = models.CharField()

二. 序列化文件 serializers.py 中创建序列化类

from rest_framework.serializers import Serializer
from models import MyModel

class MySerializer( Serializer.ModelSerializers):

    # 自定义字段
    user_name = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = ("user_name", "age")

    # 处理自定义的字段返回用户名, 通过外键获取UserModel的数据
    def get_user_name(self, obj):
        return obj.user.user_name

    def create(self,  validated_data)                                      # 处理外键字段
      return MyModel.objects.create(author=self.context["author"], **validated_data)

三.视图文件views.py中定义视图

# 视图函数中
from rest_framework.views import APIView  # 类视图中使用,集成自该类
from rest_framework.decorators import api_view # 方法视图中使用,是一个装饰器,直接装饰方法视图

from rest_framework import status
from rest_framework.response import Response # 直接可以将字典数据转换成json数据
from models import MyModel
from serializers import MySerializer
from rest_framework.request import Request
from rest_framework import exceptions

@api_view([‘GET‘, ‘POST‘, ‘PUT‘, ‘DELETE‘]) # 指明允许那些请求方式进行请求
def api_list(request):

    if request.method == ‘GET‘:
        # 向数据库查询数据,得到查询集
        try:
            query_set = MyModel.objects.all()
        except Snippet.DoesNotExist:
            return Response(status=status.HTTP_417_EXPECTATION_FAILED)
        # 调用序列化类对象,返回进行了序列化的字段集合,使用serializers.data方式 获取数据
        serializers = MySerializer(query_set, many=True)
        # 取出数据,向客户端进行返回,Response()会将数据转化为json数据.
        return Response(serializers.data, status=status.HTTP_200_OK)

     # 前端提交数据,调用模型,将其保存到数据库中
    elif request.method == ‘POST‘:      user = request.user
        #                                             将外键数据插入
        serializer = MySerializer(data= request.data, context={"author":user})
        # 如果反序列化的对象存在,就说明数据有效,将数据保存到数据库中
        if serializer.is_valid():
            # 调用save(), 从而调用序列化对象的create()方法,创建一条数据
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

原文地址:https://www.cnblogs.com/lowmanisbusy/p/9125454.html

时间: 2024-12-08 08:03:26

django rest framework 向数据库中插入数据时处理外键的方法的相关文章

如何使用myBatis在数据库中插入数据并返回主键

在MyBatis中,希望在Oracle中插入数据的同时返回主键值,而非插入的条数. ① oracle使用 selectKey. U_USER_INFO_SEQ 是在数据库中定义好的这张表关联的序列sequence, Nextval是获取自增的id <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType=&quo

向数据库中插入数据时字符集或查询是数据无法正常显示出现乱码问题

当向数据库插入数据出错或出局无法正常显示出现乱码时.首先应该想到的是数据库的编码问题.查看当前数据库服务器默认对数据库处理的字符集 show variables like  'character_set%'; character_set_client: 默认客户端来的数据格式 character_set_connection : 连接层字符集 character_set_database:  当前数据库字符集 character_set_results:服务器给外部的字符集 假如客户端字符集与数

用java向mysql数据库中插入数据为空

利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util.Scanner; import org.junit.Test;public class JDBCTest { //2).在测试方法testAAddStudent()中 //1.获取从控制台输入的Student对象:Student student=getStudentFromConsole(); /

解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题

我们使用Spring中的JdbcDaoSupport往Mysql中插入数据并返回主键代码,我们使用的mysql数据库,主键在数据库中设置为自增长:该类继承自JdbcDaoSupport,所以能直接使用getJdbcTemplate() public int saveUser(String userName,int age,String password){ getJdbcTemplate().update(new PreparedStatementCreator() { public Prepa

向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据

向Oracle数据库中插入数据出错: 经过排查,因为Update数据时没有出错,所以OracleHelper没有问题: 看异常信息提示:无效的变量和数据,应该是SQL语句的问题,调试时所传的实例UserInfo数据是正确的,所以只能是SQL语句的问题: 曾今一度怀疑这样使用Sequence是错误的,中途变换了触发器,弄了变天触发器也些错误了, 再次回到直接用序列,仔细之下,终于发现这个分号‘:’,这里应该为‘:’,实在是太小了,很难发现,以后这里最好留一个空格.

以使用QSqlQuery向数据库中插入数据为例,做一个小结

背景: 最近在使用Qt+SQLite写一个本地数据库管理程序(使用者不懂SQL),在写向数据库中插入数据的 相关的函数时,我遇到了几个问题(暂时就这些): 1.向指定字段插入指定数据时,读取到的数据都是字符串类型,然而不同字段的数据类型是不同的,这 里需要获取不同字段的数据类型,再做类型转换 2.使用QSqlQuery插入数据时,具体实现的考虑 3.在实现一个功能时,是先将功能做出来,然后对一些最初未考虑到的问题慢慢补足,还是先尽可能考 虑到所有情况,再实现相关功能 4.此时某个函数的实现,是否

java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值.毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数. 为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将时间.分钟.秒和毫

MyBatis在Oracle中插入数据并返回主键的问题解决

引言:  在MyBatis中,希望在Oracle中插入数据之时,同时返回主键值,而非插入的条数... 环境:MyBatis 3.2 , Oracle, Spring 3.2   SQL Snippet in XML Configuration: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo"> <selectKey resultType="

操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误

操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报ORA-00984列在此处不允许异常. 可以创建TestUser表,如下: create table TestUser ( usercode char(5), username varchar2(20) ) 以下例子请注意第一个字段usercode的值 1.正常例子:usercode为纯数字.可以正常插