首页
学习
活动
专区
工具
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框架除了提供APIView和GenericAPIView视图类之外,还提供了一些子类视图类,这些子类视图类同时继承了GenericAPIView和对应的Mixin扩展类...使用场景: 根据不同的操作返回不同的序列化器类和不同的查询集,重写 get_serializer_class和 get_queryset方法。...权限:区分的是认证与未认证的用户。可以进行DRF框架默认全局权限设置,也可对其进行修改,还可以指定某个视图的权限控制设置,甚至可以自定义权限控制类。权限和认证通常是一起使用的。

2.5K20
  • DRF 视图组件

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

    94010

    从入门到精通Django REST Framework-(六)

    什么是视图集?视图集是 DRF 提供的用于统一管理多个相关视图逻辑的类。...为什么要使用视图集?优势:代码复用:无需为每个动作(列表、详情、创建等)单独写视图类。路由自动化:通过 Router 自动生成 URL(如 /users/ 和 /users/{id}/)。...DRF 的路由器(如 DefaultRouter 和 SimpleRouter)通过以下机制自动生成 URL:视图集的标准化方法undefined视图集(如 ModelViewSet)定义了标准化的方法...其他视图集的使用场景GenericViewSet使用场景适用场景:需要灵活组合 Mixin 的场景(如仅支持部分操作)。...视图集中 @action 装饰器的使用@action 是 DRF 中用于在视图集(ViewSet)中定义自定义动作的核心装饰器,可以将任意方法暴露为 API 端点。下面通过更多场景详细说明其用法。

    7910

    drf之请求、响应、视图

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

    2.2K20

    【愚公系列】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框架中所有视图及用法

    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:与模型类无关或不是标准模型类接口 - 一般都是自定义功能 三.generics中GenericAPIView使用 将 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_class和get_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。...我们还展示了如何在视图集合中使用这些过滤器,并提供了一些例子来帮助你更好地理解它们的用法。

    2.1K40

    美多商城项目(五)

    ,实际是为retrieve方法添加了cache_response装饰器 CacheResponseMixin 为视图集同时补充List和Retrieve两种缓存,与ListModelMixin和RetrieveModelMixin...2.2.3为省市区视图添加缓存 因为省市区视图使用了视图集,并且视图集中有提供ListModelMixin和RetrieveModelMixin的扩展(由ReadOnlyModelViewSet提供),...因为我们序列化时需要的是省市县的名称,所以我们在嵌套序列化的时候使用StringRelatedField方法。系统自动生成的时候,默认是序列化为主键,我们需要对其进行更改。...总结回顾 1.视图集对象action属性使用场景 重写getserializerclass和get_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_方法对关联字段、自定义逻辑进行验证,防止脏数据进入数据库。

    13910

    第 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 REST Framework-如何使用视图集(三)

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

    62931

    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文档和示例,更好地利用这个强大的工具。

    47020

    构建强大的API-Django中的REST框架探究与实践

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

    40920

    第 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
    领券