首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在ModelSerializer中,带有ID的POST和GET嵌套对象在django中不能同时工作

在ModelSerializer中,带有ID的POST和GET嵌套对象在Django中不能同时工作的原因是因为Django的默认行为是将嵌套对象视为外键关系。当使用带有ID的嵌套对象进行POST请求时,Django会尝试创建一个新的嵌套对象,并将其与父对象建立关联。但是,在GET请求中,Django会尝试获取已经存在的嵌套对象,并将其作为嵌套对象的ID返回。

这种行为可能会导致一些问题,例如在POST请求中创建新的嵌套对象时,如果该对象已经存在,则会导致冲突。另外,如果在GET请求中返回嵌套对象的ID,而不是完整的嵌套对象,可能会导致客户端无法正确解析和使用这些数据。

为了解决这个问题,可以使用自定义的Serializer来处理带有ID的嵌套对象。可以通过重写Serializer的create和update方法来实现自定义的逻辑。在create方法中,可以检查嵌套对象是否已经存在,如果存在则更新关联关系,如果不存在则创建新的嵌套对象。在update方法中,可以更新嵌套对象的属性。

以下是一个示例代码:

代码语言:txt
复制
from rest_framework import serializers

class NestedObjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = NestedObject
        fields = '__all__'

class ParentObjectSerializer(serializers.ModelSerializer):
    nested_object = NestedObjectSerializer()

    class Meta:
        model = ParentObject
        fields = '__all__'

    def create(self, validated_data):
        nested_object_data = validated_data.pop('nested_object')
        nested_object_id = nested_object_data.get('id')
        if nested_object_id:
            nested_object = NestedObject.objects.get(id=nested_object_id)
            nested_object.__dict__.update(**nested_object_data)
            nested_object.save()
        else:
            nested_object = NestedObject.objects.create(**nested_object_data)
        validated_data['nested_object'] = nested_object
        return super().create(validated_data)

    def update(self, instance, validated_data):
        nested_object_data = validated_data.pop('nested_object')
        nested_object_id = nested_object_data.get('id')
        if nested_object_id:
            nested_object = NestedObject.objects.get(id=nested_object_id)
            nested_object.__dict__.update(**nested_object_data)
            nested_object.save()
        else:
            nested_object = NestedObject.objects.create(**nested_object_data)
        instance.nested_object = nested_object
        return super().update(instance, validated_data)

在上述示例代码中,我们通过重写create和update方法来处理带有ID的嵌套对象。在create方法中,我们首先检查嵌套对象是否已经存在,如果存在则更新关联关系,如果不存在则创建新的嵌套对象。在update方法中,我们也是同样的逻辑,更新嵌套对象的属性。

这样,我们就可以在ModelSerializer中使用带有ID的POST和GET嵌套对象,并且能够正确处理它们的关联关系。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django model object序列化实例

提到序列化与反序列化,通常会想到 json ,xml .J2EE开发,这是很常用技术,比如一个java class与xml之间序列化与反序列化,我们可以通过 xstream来实现,如果是与json...但现在问题是,这个json包不能序列化 django models 里面的对象实例。 经过分析,网络搜索,发现有如下解决方案....,因为 SomeModel.objects.get(id=myid) 返回是一个具体实例,而不是一个集合对象,因此是不可以 iterable 。...一般来说,从网络得回POST(或者GET) 参数中所包含json数据 例如,用POST传过来参数中有一个key value键值对为 request.POST...这样一来就可以很好使用配合SimpleJsonDjango来完成序列化工作了 2.直接利用python 2.7 提供json包,或者用simplejson都可以 首先,你需要在django model

1.4K10

DjangoRESTframework(补充)

验证失败,可以通过序列化器对象 errors 属性获取错误信息,返回一个字典, 包含字段字段错误,若是非字段错误,可以通过修改 REST framework 配置 NON_FIElD_ERRORS_KEY...("图书不是关于Django") return value 2) validate 序列化器需要同时对多个字段进行比较验证时,可以定义 validate 方法进行验证 class... request.POST 包含了解析之后文件非文件数据 包含了对POST、PUT、PATCH请求方式解析后数据 利用了REST frameworkparsers解析器,不仅支持表单类型数据...APIView与View不同之处在于: 传入到视图方法是REST frameworkRequest对象,而不是DjangoHttpRequeset对象; 视图方法可以返回REST framework...APIView仍以常规类视图定义方法来实现get() 、post() 或者其他请求方式方法。

2.2K30
  • DjangoRestFramework,序列化组件、视图组件

    POST请求接口写法,下面我们来完成PUT、DELETE、GET查看单条数据几个接口。...需要注意,如果在 ModelSerializer HyperlinkedModelSerializer如果models.DateTimeField带有auto_now=True或者auto_add_now...一种常见使用场景就是Model存在user_id作为外键,在用户提交时,不允许提交user_id,但user_id定义Model时又是必须字段,这种情况下就可以使用HiddenField提供一个默认值...等基础校验之外,还会会根据咱们写这个序列化组件设置字段中有read_only=True属性字段排除掉,这也是为什么我们面写多对多一对多字段时,如果字段名称model表多对多或者一对多字段名称相同...() serializer_class = PublishSerializers # def get(self,request,id):#id就不需要传了,因为人家要求url添加命名分组

    2.6K20

    django-rest-framewor

    2 解析器组件 (用来解析数据请求组件)   Django不能处理请求协议为application/json编码协议数据   注意: DRF解析器会封装到Viewparsers内,视图函数被调用时...定义需要返回字段(字段类型可以与model类型不一致,参数也可以调整),字段名称必须与model一致 GET接口逻辑,获取QuerySet 开始序列化:将QuerySet作业第一个参数传给序列化类...,many默认为False,如果返回数据是一个列表嵌套字典多个对象集合,需要改为many=True 返回:将序列化对象data属性返回即可  {{ 实践代码 }} --post接口设计 url...定义:需要为post新增url,因为根据规范,url定位资源,http请求方式定义用户行为 定义post方法:视图类定义post方法 开始序列化:通过我们上面定义序列化类,创建一个序列化对象,传入参数...返回结果 5 认证组件   cookiesession两种方式可以保存用户信息,这两种方式不同是cookie保存在客户端浏览器,而session保存在服务器,他们各有优缺点,配合起来使用,可将重要敏感信息存储

    1.6K10

    django rest framework serializers解读

    serializers.fieild 我们知道django,form也有许多field,那serializers其实也是drf中发挥着这样功能。我们先简单了解常用几个field。...,我们django,form更强调对提交表单进行一种验证,而serializerfield不仅在进行数据验证时起着至关重要作用,将数据进行序列化后返回也发挥着重要作用!...,我觉得用很好,一眼看出,这是为postpatch所设置,没错,这一部分功能是专门为这两种请求所设计,如果只是简单get请求,那么设置了前面的field可能就能够满足这个需求。...我们mixins博客中提及到,post请求对应create方法,而patch请求对应update方法,这里提到create方法与update方法,是指mixins特定类方法。...就更简单了,直接通过映射就好了 不过这样只是用户获得只是一个外键类别的id,并不能获取到详细信息,如果想要获取到具体信息,那需要嵌套serializer category = CourseCategorySerializer

    1.8K10

    第 3 篇:实现博客首页文章列表 API

    开发同时说过,django-rest-framework 开发传统开发方式没有什么不同,区别仅在于返回数据格式不同而已。...基于模板引擎开发方式,博客首页文章列表视图函数可能是这样: from django.shortcuts import render from .models import Post def..., 'blog/index.html', context={'post_list': post_list}) django-rest-framework,代码逻辑是一样,只是最后返回结果时,返回资源序列化后结果...转换过程,还会进行数据合法性校验。 先来看一个简单例子(摘自 django-rest-framework 官网示例),理解序列化器工作原理功能。...被序列化对象序列化后数据是一个扁平 Python 字典,字典数据描述了这个对象资源。

    1K20

    Django+Vue开发生鲜电商平台之6.使用Vue实现商品类别商品数据前台显示

    一、商品类别数据接口 由之前效果图需求分析可知,首页全部商品分类需要展示一级、二级三级分类,而在搜索结果页只展示一级二级分类,分类有两个Vue组件,即Header全部商品分类左侧某以及类别对应分类导航栏...此时,以嵌套形式父类别显示出子类别,并且属于三层嵌套。...显然,此时地址传入指定id,只显示该id对应类别的信息其子类别的信息。...在前端项目fresh_onlinesrc/api/api.js定义了数据API接口: import axios from 'axios'; let host = 'http://shop.projectsedu.com...= params => { return axios.get(`${local_host}/goods/`, { params: params }) } 同时,向后端请求参数有一个为top_category

    1.7K32

    Python进阶40-drf框架(二)

    去处理 # 2)判断处理结果(返回值)response,有值代表drf已经处理了,None代表需要自己处理 # 自定义异常处理文件exception,文件书写exception_handler函数...user_obj = models.User.objects.get(pk=pk) ## 用户对象不能直接作为数据返回给前台 ## 序列化...(self,obj): return obj.get_gender_display()  序列化过程,我们可以删除不想显示字段,就比如说是gender,这样的话,就可以把gender_value...user_obj = models.User.objects.get(pk=pk) ## 用户对象不能直接作为数据返回给前台 ## 序列化...可以将值取出校验 # # 3)为有联合关系字段们提供全局钩子函数,如果某些字段不入库,可以将值取出校验 # # 4)重写create方法,完成校验通过数据入库工作,得到新增对象

    2K20

    django写接口(入门篇)

    blank null serializer 为 allow_blank allow_null,其余类似,可以参考 django model 部分设置参数。...) 3 创建 rest view 函数 rest_framework 类似 django,需要通过 view 来展示接口返回数据信息, views.py 创建视图函数 from django.views.decorators.csrf...', 'modified_time', 'excerpt'] # exclude 为不展示字段名, fields 不能同时设置 # exclude = ['id',...接着我们需要来操作对某篇具体 post 进行信息修改,那就涉及到了 post id,还记得我们 django 部分如何操作这种 url 么,忘记了往前翻翻......接着我们通过一个 detail...# 首先我们 model 增加两个链表结构字段,同时创建相关 model 并生成数据库 class PostModel(models.Model): # ....

    3.1K30

    测试开发进阶(二十九)

    get/post/put/delete等请求方法,而只支持action动作 但是 ViewSet类没有提供 get_object(), get_serializer等方法 继承 viewsets.GenericViewSet... View DRF APIView GenericAPIView mixins扩展类 CreateAPIView(合并拓展类) 视图集 action请求方法映射 ViewSet GenericViewSet...第二个参数viewset为视图集「不要加as_view」 将自动生成路由添加到列表 from django.urls import path, includefrom projects import...参数用于指定该动作支持请求方法,默认为get detail用于指定该动作要处理是否为详情资源对象「url是否需要传递pk值」 url.py添加 path('project/names/', views.ProjectsViewSet.as_view...: model = Projects fields = ('id', 'name') view添加 @action(methods=['get'], detail=False

    66810

    Django实践-10RESTful架构DRF入门

    资源只能是名词不能是动词,而且名词往往和数据库表名相对应。同时,利用HTTP方法(post, get, put, delete)可以分离网址中资源名称操作。...#获取信息 请求方法(HTTP动词) URI 解释 GET /students/ 获取所有学生 POST /students/ 新建一个学生 GET /students/ID/ 获取指定ID学生信息...DRF中封装了Serializer类ModelSerializer类用于实现序列化操作,通过继承Serializer类或ModelSerializer类,我们可以自定义序列化器,用于将对象处理成字典,...GroupUser,我们使用是HyperlinkedModelSerializer超链接关系。您也可以使用主键各种其他关系,但是超链接是很好RESTful设计。...4.polls2views.py添加restful风格函数 5.urls.py配置url映射 6.static/html中新建前端页面 7.运行测试

    32721

    浅谈django不使用restframework自定义接口与使用区别

    django可以使用restframework快速开发接口,返回前端所需要json数据,但是有时候利用restframework开发接口并不能满足所有的需求,这时候就需要自己手动开发接口,也就是将需要用到某些对象转化为需要使用...1.定义我们需要模型类,并且在对应模型类定义对应对象转化为字典函数 from django.db import models class Questionnaire(models.Model...类自己定义get方法与post方法处理请求,首先获取到所有的问卷对象将每一个问卷对象通过自定义函数转化为字典,最后返回json数据,同样处理post请求添加问卷时,首先获取到问卷标题,然后实例化一个问卷对象...(self,request,*args,**kwargs): '''假设前端通过post传过来一个json数据''' #把requestjson转化为python对象 data = json.loads...请求来获取所有问题json数据,通过post方法从前端获取到传递过来json数据,将其转化为对象并保存。

    78230

    Django REST 框架详解 04 | 序列化与反序列化及二者整合

    1.视图 2.路由 3.接口测试 一、序列化 1.步骤 model s.py,定义表与字段,及表关系 serializes.py 序列化与反序列化 views.py getpost 等操作...Model 不能在数据库创建表 # 声明基表,设置 abstract = True class Meta: abstract = True class Book(BaseModel...publish = attrs.get('publish') # 这里外键已经变成对象 name = attrs.get('name') if models.Book.objects.filter...三、序列化与反序列整合 从数据安全性健壮性来考虑,所有的自定义字段不能与 model 原字段相同 因为序列化是将外键字段作为 Dict,而反序列化会将外键字段作为 Object 1.视图 views.py...model 对应字典 # 群增,传数据是装多个 model 对应字典列表 def post(self, request, *args, **kwargs): request_data

    1.1K10

    (项目)生鲜超市(七)

    八、商品详情页功能 1、viewsets实现商品详情页接口   商品轮播图是一个外键,序列化时候需要用嵌套方式来实现: 1 class GoodsImageSerializer(serializers.ModelSerializer...id,因为取消收藏时候必须知道商品id是多少 23 fields = ('user', 'goods', 'id')   然后views.py编写用户收藏接口,收藏需要继承CreateModelMixin...4、drf权限验证   utils下新建permissions.py,这个官网有实例,直接复制过来即可,把其中owner改为user即可: 1 from rest_framework import...14 lookup_field = 'goods_id' 15 16 # 只能查看当前登录用户收藏,不会获取所有用户收藏 17 def get_queryset(self...删除settingsrest_framework_jwt.authentication.JSONWebTokenAuthentication 5、Vue用户收藏接口联调   修改Vue前端代码

    68430

    Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存限速功能开发

    3.商品系列分类展示功能 商品系列分类包括左侧导航栏右侧商品列表,大类对应多个品牌、大类对应多个小类、大类对应多个商品,即包含3个一对多关系,定义序列化时需要嵌套定义。...为了创建brand时只显示一级类别,adminx.py定义GoodsBrandAdmin类时重写了get_context()方法,其中获取到category字段只取category_type为1数据...但是同时也可以看到,商品image属性值即图片链接未自动添加域名,这是因为进行嵌套序列化默认不会添加域名,需要给字段设置context属性,配置如下: class IndexCategorySerializer...销售量一般是支付成功后更新,所以apps/trade/views.pyAliPayView实现: class AliPayView(APIView): ''' get:...retrievelist方法,这主要是查询操作,对于新建、修改等操作一般是不能使用缓存

    2.2K10

    DRF框架学习(二)

    2.明确RestAPI接口实现时主要工作 2.1序列化&反序列化 把程序数据结构类型转换为其他格式数据,这个过程叫做序列化过程 例:将模型类对象转换为字典或者json数据过程,就叫做序列化过程...2.2RestAPI接口核心工作: 把数据库数据序列化为前端所需要格式,并返回。 把前端发送数据反序列化为模型类对象,并保存到数据库。...Django框架学习创建demo工程,settings.pyINSTALLED_APPS添加’rest_framework’。...django路由列表 4.Serializer序列化器 作用:进行数据序列化反序列化 序列化:把对象转换为字典 反序列化:数据校验;数据保存(可以利用这一点实现新增更新); 4.1使用 定义一个序列化器类...4.5序列化功能(重点掌握) 把实例对象转换为字典数据 知识点: 1、序列化单个对象 2、序列化多个对象 3、关联对象嵌套序列化 1)将关联对象序列化为关联对象主键 # 英雄类(多)添加 hbook

    4.1K30

    ModelSerializer序列化器实战

    序列化器实战 上篇ModelSerializer序列化器做了一个小demo,演示了如何操作单表进行序列化反序列化来实现五个API使用,多表大差不差,这里对四个表写五个API接口 单表操作...# 这里注意id字段是从表模型映射过来,auto自增,不传也可以 # 自定制字段不传必须注册,列表 fields = ['id', 'title', 'price...:两种写法:序列化类写;models写 price_info = serializers.SerializerMethodField() def get_price_info(self...,instancemany ''' instance:要序列化对象 qs,单个对象 many:如果是qs对象,many=True,如果是单个对象many...,那么新增数据时候,就得先新增作者详情表,再增作者表数据,但是实际生活,用户不知道表关系这码事,为了体验更好,可以重写create方法,同时存两个表内容,给用户感觉就是操作了一张表 ''

    39720
    领券