完全迷失:在 Django Rest 框架中使用序列化器和更新的多对多

Posted

技术标签:

【中文标题】完全迷失:在 Django Rest 框架中使用序列化器和更新的多对多【英文标题】:Completely Lost: Many To Many with Serializers and Update in Django Rest Framework 【发布时间】:2016-06-24 08:12:43 【问题描述】:

我已经研究了几个小时了,但我没有找到解决方案。我就是不明白。

我有一个有很多孩子的父母。我创建了一个视图,允许我获取所有父母的孩子。现在我想结束该列表并使用新的子列表对父进行 PATCH。我知道我需要编写一个自定义的 update 方法,但我不知道如何使它工作。

这是我的子序列化器:

class ChildSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = models.Child
        fields = ('id', 'url', 'name',)

这是我的父序列化程序:

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

    class Meta:
        model = models.Parent
        fields = ('id', 'url', 'name', 'children',)

    def update(self, instance, validated_data):
        submitted_children = validated_data.get('children')
        if submitted_children:
            for child in submitted_children:
                child_instance = Child.objects.get(id=child.id)
                instance.children.add(child_instance)
        instance.save()
        return instance

我对需要发生的事情的理解是......

    获取提交的孩子validated_data.pop('children') 遍历它们并将每一个添加到 parent.children 多对多 保存父模型

我可能在这里尝试了十几种不同的想法,但我似乎无法让它发挥作用。上面的代码不会改变 children_set。

欢迎提出任何建议。

作为参考,我研究了以下内容:

http://www.django-rest-framework.org/api-guide/serializers/#saving-instances

http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

http://www.django-rest-framework.org/api-guide/serializers/#validation

django rest framework many to many json write

还有很多,但我现在不记得了

更新:

["id":2,"url":"http://127.0.0.1:8000/api/v1/children/2","first_name":"Tom","last_name":"Jones","date_of_birth" :"1969-03-14"]

【问题讨论】:

submitted_children 是否包含预期值? 我的意思是在更新方法中。你打印了吗? 原谅我的无知,但是你说的“打印出来”是什么意思? print(submitted_children) 或任何其他调试方式 嗯。我打补丁的时候它是空的。 【参考方案1】:

我认为您的 JSON 不正确。它应该是这样的:


 "id": 1,
 "url": "some url",
 "name": "John Smith",
 "children": [
   "id": 2, "url": "child url", "name": "childs name",
   "id": 3, ...
 ]

【讨论】:

噢噢噢!我发送 API 的方式不知道把它放在哪里。对于 PATCH,它只会写孩子。对吗? 你创建update方法的方式,它只会写孩子。【参考方案2】:

点击此处获取问题的简单解决方案。它不涉及覆盖更新方法,因此在使用 M2M 的序列化程序中是通用的:

https://***.com/a/55043187/5626788

关键是实例化一个序列化程序,传递实例、数据字典和partial=True 标志,以便更新除主键之外的任何给定字段。

【讨论】:

以上是关于完全迷失:在 Django Rest 框架中使用序列化器和更新的多对多的主要内容,如果未能解决你的问题,请参考以下文章

python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)

python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)

如何使用 Django Rest Framework 创建登录 API?

Django REST框架--认证和权限

如何在 Django REST 框架中使用事务?

是否可以在 django rest 框架序列化程序中使用重用 django 表单进行验证?