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

如何在DRf中使用嵌套的序列化程序和视图集同时更新和创建?

在DRF(Django REST Framework)中,可以使用嵌套的序列化程序和视图集来实现同时更新和创建的功能。下面是一个示例:

首先,需要定义嵌套的序列化程序。假设有两个模型,一个是Parent,另一个是Child,它们之间是一对多的关系。可以创建两个序列化程序,一个用于Parent,另一个用于Child。

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

class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Child
        fields = '__all__'

class ParentSerializer(serializers.ModelSerializer):
    children = ChildSerializer(many=True)

    class Meta:
        model = Parent
        fields = '__all__'

    def create(self, validated_data):
        children_data = validated_data.pop('children')
        parent = Parent.objects.create(**validated_data)
        for child_data in children_data:
            Child.objects.create(parent=parent, **child_data)
        return parent

    def update(self, instance, validated_data):
        children_data = validated_data.pop('children')
        children = (instance.children).all()
        children = list(children)
        instance = super(ParentSerializer, self).update(instance, validated_data)

        for child_data in children_data:
            child = children.pop(0)
            child.name = child_data.get('name', child.name)
            child.age = child_data.get('age', child.age)
            child.save()

        return instance

然后,需要定义视图集来处理请求。可以使用ModelViewSet来简化代码。

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

class ParentViewSet(viewsets.ModelViewSet):
    queryset = Parent.objects.all()
    serializer_class = ParentSerializer

最后,将视图集添加到URL配置中。

代码语言:txt
复制
from django.urls import include, path
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'parents', ParentViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

现在,可以通过发送POST请求来创建Parent和Child的嵌套关系,或者通过发送PUT/PATCH请求来更新Parent和Child的嵌套关系。

创建Parent和Child的示例请求:

代码语言:txt
复制
POST /parents/
{
    "name": "Parent 1",
    "children": [
        {
            "name": "Child 1",
            "age": 10
        },
        {
            "name": "Child 2",
            "age": 12
        }
    ]
}

更新Parent和Child的示例请求:

代码语言:txt
复制
PUT /parents/<parent_id>/
{
    "name": "Updated Parent",
    "children": [
        {
            "id": <child_id>,
            "name": "Updated Child",
            "age": 15
        }
    ]
}

这样,就可以在DRF中使用嵌套的序列化程序和视图集同时更新和创建了。关于DRF的更多信息和用法,请参考DRF官方文档

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

相关·内容

DRF框架学习(二)

2.明确RestAPI接口实现时主要工作 2.1序列化&反序列化程序数据结构类型转换为其他格式数据,这个过程叫做序列化过程 例:将模型类对象转换为字典或者json数据过程,就叫做序列化过程...把其他格式数据转换为程序数据结构类型,这个过程叫做反序列化过程。 例:将前端传递数据保存到模型对象过程,叫做反序列化过程。...编写视图 在booktest应用views.py创建视图BookInfoViewSet,这是一个视图集合。...django路由列表 4.Serializer序列化器 作用:进行数据序列化序列化 序列化:把对象转换为字典 反序列化:数据校验;数据保存(可以利用这一点实现新增更新); 4.1使用 定义一个序列化器类...4.7模型类序列化ModelSerializer 如果我们想要使用序列化器对应是Django模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer

4.1K30

重点内容回顾-DRF

4.关联对象嵌套序列化 4.1PrimaryKeyRelatedField 将关联对象序列化为关联对象主键。...操作序列化器: 属性: serializer_class(指定视图所使用序列化器类) 方法: get_serializer_class返回视图所使用序列化器类 get_serializer创建视图所使用序列化器类对象...为了方便我们开发RestAPI,DRF框架除了提供APIViewGenericAPIView视图类之外,还提供了一些子类视图类,这些子类视图类同时继承了GenericAPIView对应Mixin扩展类...使用场景: 根据不同操作返回不同序列化器类不同查询集,重写 get_serializer_class get_queryset方法。...权限:区分是认证与未认证用户。可以进行DRF框架默认全局权限设置,也可对其进行修改,还可以指定某个视图权限控制设置,甚至可以自定义权限控制类。权限认证通常是一起使用

2.4K20
  • DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图“七十二变” 第一层:基于APIview五个接口 第一层五个接口demo...action属性 DRF 视图组件 DRF框架提供了很多通用视图基类与扩展类,上篇使用APIView是比较偏Base,视图使用更加简化了代码,这里介绍一下其他视图用法 Django...REST framwork 提供视图主要作用: 控制序列化执行(检验、保存、转换数据) 控制数据库查询执行 先来看看这其中的人情世故:两个视图基本类,五个扩展类,九个视图子类,视图集方法,视图集...GenericViewSet就帮助我们完成了这样继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典({'get':'list'}`)映射处理工作同时...例如,创建绑定'GET''POST'方法具体视图 到“列表”创建”动作… = MyViewSet视图。

    91910

    【愚公系列】2022年04月 Python教学课程 70-DRF框架之视图集

    前言 使用图集ViewSet,可以将一系列逻辑相关动作放到一个类: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据...视图集只在使用as_view()方法时候,才会将action动作与具体请求方式对应上。...# 初始化生成序列化器对象 ser = BookSerializer(books, many=True) # 使用序列化器对象data方法获取序列化结果...GenericViewSet就帮助我们完成了这样继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典({‘get’:‘list’})映射处理工作同时...同一个类指定视图采用不同queryset或者不同序列化器 """ def get_queryset(self): """在视图集中视图对象下面会新增一个action

    1.6K30

    drf之请求、响应、视图

    提供视图主要作用有: 控制序列化执行(检验、保存、转换数据) 控制数据库查询执行 它还提供了许多视图基类拓展类,用于简化视图编写。...提供关于序列化使用属性与方法 属性:serializer_class  指明视图使用序列化器 方法: get_serializer_class(self) : 当出现一个视图类调用多个序列化器时...,那么可以通过条件判断在get_serializer_class方法通过返回不同序列化器类名就可以让视图方法执行不同序列化器对象了。...使用图集ViewSet,可以将一系列逻辑相关动作放到一个类: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据 destory...GenericViewSet就帮助我们完成了这样继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典({'get':'list'})映射处理工作同时

    2.1K20

    drf框架中所有视图及用法

    0909自我总结 drf框架中所有视图及用法 一.drf框架所有视图类 from django.views import View from rest_framework import views,...generics, mixins, viewsets 最基础:django自带views类 drf框架中最基础视图类:views.APIView drf框架工具视图:generics GenericAPIView...上述视图都是基于django自带views进行相关方法分装 二.viewsets视图集 ViewSetMixin:视图集工具 - 重写as_view - 将 请求方式 映射到视图类 指定方法...那继承功能,也可以自定义功能 ViewSet:与模型类无关或不是标准模型类接口 - 一般都是自定义功能 三.genericsGenericAPIView使用 将 queryset serializer_class...data:用于返序列化传参 many:获取多个序列化对象 instance:如果有后面save执行更新方法,没有执行创建方法 partial:为True可以进行局部字段修改,默认为False为所有字段修改

    1.8K30

    DRF框架学习(三)

    DRF框架学习(三) 1.视图 1.1作用 1.控制序列化执行(数据检验、数据保存、转换数据(序列化操作)) 2.控制数据库查询操作。...功能: 1.视图中request对象不再是Django HttpRequest类对象,而是由DRF框架封装成 Request类对象。...=self.get_serializer_class()获取当前视图所使用序列化器类; serializer_cls(*args,**kwargs)创建一个序列化器类对象。...b)方法: get_serializer创建一个视图所使用序列化器类对象。 get_serializer_class返回当前视图所使用序列化器类。...2.4视图集中添加额外处理方法 1、直接在视图集中定义额外处理方法即可 2、在进行url配置时候指定请求地址请求方式处理函数之间对应关系。

    1.2K20

    DRF框架学习(四)

    DRF框架学习(四) 1.视图集对象action属性 作用: 获取现在要执行是哪一种操作。 self.action:是字符串类型,目的是获取所有执行操作。...使用场景: 重写 get_serializer_classget_queryset,根据不同操作返回不同序列化器类不同查询集。...返回latest操作所使用查询集 else: # 返回其他操作所使用查询集 2.路由Router(urls文件中使用) 作用:(重点) 配合视图集进行使用,动态生成视图集中处理函数...6.1 使用 DRF框架默认没有进行全局限流设置,但是提供了配置项,我们可以在配置文件使用 DEFAULT_THROTTLE_CLASSES DEFAULT_THROTTLE_RATES进行全局配置...我们可以在配置文件设置全局分页方式,: REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': '', 'PAGE_SIZE'

    2.8K40

    Django REST Framework-如何使用过滤器

    DRF 提供了很多有用功能,其中之一就是过滤器(filters)。过滤器是一种机制,它可以让你在获取资源时对它们进行过滤。在 DRF ,你可以使用内置过滤器或者编写自定义过滤器。...我们创建了一个名为 BookViewSet 图集合,它使用了 Book 模型 BookSerializer 序列化器。...在这个例子,我们使用 queryset.filter() 方法过滤出价格大于等于 10 书籍。接下来,我们需要将这个自定义过滤器添加到我们图集。...结论使用 DRF 过滤器可以帮助你快速地过滤出你需要数据。在本文中,我们介绍了 DRF 内置过滤器,例如 SearchFilter、OrderingFilter RangeFilter。...我们还展示了如何在图集合中使用这些过滤器,并提供了一些例子来帮助你更好地理解它们用法。

    2K40

    美多商城项目(五)

    ,实际是为retrieve方法添加了cache_response装饰器 CacheResponseMixin 为视图集同时补充ListRetrieve两种缓存,与ListModelMixinRetrieveModelMixin...2.2.3为省市区视图添加缓存 因为省市区视图使用了视图集,并且视图集中有提供ListModelMixinRetrieveModelMixin扩展(由ReadOnlyModelViewSet提供),...因为我们序列化时需要是省市县名称,所以我们在嵌套序列化时候使用StringRelatedField方法。系统自动生成时候,默认是序列化为主键,我们需要对其进行更改。...总结回顾 1.视图集对象action属性使用场景 重写getserializerclassget_queryset,根据不同action操作,返回不同序列化不同查询集。...上面的代码在创建序列化器对象时候,会向序列化器对象context属性补充request参数。 4.商品数据存储 商品存储数据表设计。 SPU:属性值,特性相同商品统称。

    1.2K30

    Flask框架在Python面试应用与实战

    Django REST framework (DRF) 是一个强大而灵活工具包,用于构建Web API,特别是基于Django应用程序。...一、常见面试问题核心组件与工作流程视图(Views):解释视图在DRF作用,介绍基于类视图(ViewSet、GenericViewSet)与视图集(ViewSets)概念,以及如何关联到URL。...路由与URL配置路由器(Router):说明路由器如何根据ViewSet自动创建API路由,以及如何自定义路由命名视图动作。...版本控制:讨论DRF实现API版本控制方法,URL路径版本、请求头版本等。...二、易错点与避免策略序列化器验证遗漏:确保在序列化充分定义验证规则,使用validate_方法对关联字段、自定义逻辑进行验证,防止脏数据进入数据库。

    13510

    第 16 篇:别再手动管理接口文档了

    经过大家努力,现在已经有了很多成熟接口文档标准生成工具,其中 OpenAPI Specification[1] 就是一个被广泛接收使用标准,我们博客接口使用文档自动化工具,也会基于 OpenAPI..."pure_pagination", # 分页 "haystack", # 搜索 "drf_yasg", # 文档 ] 接着使用 drf_yasg 提供函数来创建一个 django...原理是 drf-yasg 会尝试去解析接口对应序列化器(Serializer),从序列化器中提取出对应请求和响应字段(如果序列化找不到,它会进一步去序列化器关联模型找),因此我们就可以给序列化定义字段添加说明信息...,但在全局进行了配置),在解析 list_archive_dates 参数时,drf-yasg 错误地解析到了从视图集继承来 PostFilter PageNumberPagination,所以就把这两个类定义参数也包含进文档了...原因也很明显,这个接口对应 action 是 list_archive_dates,drf-yasg 在这个 action 没有找到解析响应结果序列化器(Serializer),所以它跑去视图集

    1.8K20

    第 11 篇:基于 drf-haystack 文章搜索接口

    作者:HelloGitHub-追梦人物 在 django 博客教程,我们使用了 django-haystack Elasticsearch 进行文章内容搜索。...但是,通过之前功能我们看到,使用 django-rest-framework 是一个近乎标准化但又枯燥无聊过程:首先是编写序列化器用于序列化资源,然后是编写视图集,提供对资源各类操作接口。...此时就要发挥开源社区力量,去 GitHub 使用关键词 rest haystack 搜索,果然搜到一个 drf-haystack 开源项目,专门用于解决 django-rest-framework ...,为了复用已经定义好用于序列化文章列表序列化器,我们直接继承了 PostListSerializer,同时我们还混入了 HaystackSerializerMixin,这是 drf-haystack...对象,这个对象就是视图中 HTTP 请求对象,但是因为 django request 对象无法像 flask 那样从全局获取,因此 drf 在视图中将其保存在了序列化序列化字段 context

    1.6K20

    Django DRF路由与扩展功能实现

    图集与路由使用 使用图集ViewSet,可以将一系列逻辑相关动作放到一个类: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据...GenericViewSet就帮助我们完成了这样继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典({‘get’:’list’})映射处理工作同时...GenericViewSet时,虽然已经提供了基本调用数据集(queryset)序列化器属性,但是我们要编写一些基本 API时,还是需要调用DRF提供模型扩展类 [Mixins] """ from...扩展功能 为了方便接下来学习,我们创建一个新子应用 opt python3 manage.py startapp opt 因为接下来功能需要使用到登录功能,所以我们使用django内置admin...可以在配置文件全局设置默认权限管理类,: REST_FRAMEWORK = { ....

    3K30

    Django REST Framework-如何使用图集(三)

    定制视图集操作视图集提供了一些通用操作,例如获取列表、创建对象、获取详情、更新对象、部分更新对象删除对象等。如果需要定制这些操作行为,可以在视图集中重写对应方法。...我们使用 self.request.user 获取当前请求用户,并将其设置为新书籍作者。...我们使用 self.request.user 获取当前请求用户,并将其用于过滤书籍列表,只返回当前用户书籍。视图集类型DRF 中提供了多种视图集类型,可以根据不同需求选择合适图集类型。...ReadOnlyModelViewSet: 提供了默认读取操作,但不支持创建、更新和删除操作。GenericViewSet: 提供了多种操作,例如列表、创建、获取详情、更新、部分更新和删除等。...ViewSet: 不提供任何操作,需要手动在子类定义操作方法。视图集类型选择取决于 API 需求和开发人员编写习惯。

    61931

    Python 如何开发出RESTful Web接口,DRF框架助力灵活实现!

    它基于Django,提供了一套用于构建Web API组件工具,简化了API开发过程,同时保留了Django优雅强大。 一、Web应用模式 在开发Web应用时,通常有两种开发模式。...DRF优点: • 提供了定义序列化器Serializer方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化; • 提供了丰富类视图、Mixin扩展类,简化视图编写; • 丰富定制层级...:函数视图、类视图、视图集合到自动生成 API,满足各种需要; • 多种身份认证权限认证方式支持 JWT; • 内置了限流系统; • 直观 API web 界面; • 可扩展性,插件丰富 2、安装设置...五、结语 本篇文章小圈只是做了一个简单引入以及介绍,DRF有很多其他功能选项,可以满足复杂API需求。...比如:丰富类视图、身份认证与权限管理等,后续小圈会抽空根据案例为大家带来更精细化DRF学习教程。现在我们可以通过深入研究DRF文档示例,更好地利用这个强大工具。

    45520

    构建强大API-DjangoREST框架探究与实践

    在views.py定义了一个视图集使用了ModelViewSet,它提供了默认CRUD操作。在urls.py配置了路由,将API端点映射到对应图集上。6....数据序列化与性能优化在处理大量数据时,有效地序列化序列化数据对性能至关重要。Django REST框架提供了丰富序列化性能优化功能,可以帮助我们提高应用程序性能效率。...例如,我们可以定义一个嵌套序列化器来序列化序列化关联模型:class UserProfileSerializer(serializers.ModelSerializer): user = UserSerializer...return Response(data)此外,我们还可以使用DRFResponse渲染器和解析器来自动处理不同类型响应数据,JSON、XML等。...首先,我们学习了如何使用Django REST框架来创建简单API端点,包括定义模型、序列化器、视图集以及路由配置等。

    39420

    第 9 篇:实现分类、标签、归档日期接口

    获取单个资源、update partial_update 更新资源、destroy 删除资源,这些 action 具体实现方法,分别由 mixins 模块混入类提供。...list_archive_dates 具体实现逻辑,以下几点需要注意: 一是独立使用序列化字段(Field)。...之前序列化字段都是在序列化器(Serializer)里面使用,因为通常来说接口需要序列化一个对象多个字段。...而这个接口中只需要序列化一个时间字段(类型为 Python 标准库 datetime.date),所以没必要单独定义一个序列化器了,直接拿 django-rest-framework 提供用于序列化时间类型...现在,侧边栏所需要数据接口就开发完成了,接下来实现返回某一分类、标签或者归档日期下文章列表接口。 在 使用图集简化代码 我们开发了获取全部文章接口。

    2.6K30

    DjangoRESTframework(补充)

    ', views.BookInfoViewSet) # 向路由器中注册视图集 urlpatterns += router.urls # 将路由器所以路由信息追到到django路由列表 定义序列化器...验证失败,可以通过序列化器对象 errors 属性获取错误信息,返回一个字典, 包含字段字段错误,若是非字段错误,可以通过修改 REST framework 配置 NON_FIElD_ERRORS_KEY...但是我们可以使用depth来简单生成嵌套表示,depth应该是整数,表明嵌套层级数量。...使用图集ViewSet,可以将一系列逻辑相关动作放到一个类: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据 destory...视图集只在使用as_view()方法时候,才会将action动作与具体请求方式对应上。

    2.2K30
    领券