栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

django-rest-framework 3.0在嵌套序列化程序中创建或更新

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django-rest-framework 3.0在嵌套序列化程序中创建或更新

首先,您要支持创建新的图书实例还是仅更新现有的图书实例?

如果您只想创建新的图书实例,则可以执行以下操作…

class PageSerializer(serializers.Serializer):    text = serializers.CharField(max_length=500)class BookSerializer(serializers.Serializer):    page = PageSerializer(many=True)    title = serializers.CharField(max_length=50)    def create(self, validated_data):        # Create the book instance        book = Book.objects.create(title=validated_data['title'])        # Create or update each page instance        for item in validated_data['pages']: page = Page(id=item['page_id'], text=item['text'], book=book) page.save()        return book

请注意,我 没有

book_id
此处添加。在创建图书实例时,我们不会包含图书ID。当我们更新图书实例时,通常会将图书ID包含在URL中,而不是包含在请求数据中。

如果你想支持创建和书籍实例的更新,那么你需要考虑一下你要如何处理未包含在请求页面,但 当前与书实例相关联。

您可能会选择静默忽略那些页面并保持原样,或者想引发验证错误,或者想要删除它们。

假设您要删除请求中未包含的所有页面。

def create(self, validated_data):    # As before.    ...def update(self, instance, validated_data):    # Update the book instance    instance.title = validated_data['title']    instance.save()    # Delete any pages not included in the request    page_ids = [item['page_id'] for item in validated_data['pages']]    for page in instance.books:        if page.id not in page_ids: page.delete()    # Create or update page instances that are in the request    for item in validated_data['pages']:        page = Page(id=item['page_id'], text=item['text'], book=instance)        page.save()    return instance

您也可能 希望支持书籍更新,而不希望支持创建,在这种情况下, 包含

update()
方法。

您还可以通过多种方式减少查询数量,例如。使用批量创建/删除操作,但以上操作将以非常简单的方式完成工作。

如您所见,在处理嵌套数据时,您可能想要的行为类型有些微妙,因此,请仔细考虑在各种情况下期望的行为。

另请注意,我

Serializer
在上面的示例中一直使用而不是
ModelSerializer
。在这种情况下,仅将所有字段显式包括在serializer类中,而不是依赖
ModelSerializer
默认情况下自动生成的一组字段,会更简单。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/485371.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号