完全丢失:Django Rest Framework中的序列化程序和更新中的多对多

时间:2016-03-09 18:59:08

标签: django django-rest-framework vue.js

我现在已经看了好几个小时,而且我找不到解决方案。我只是没有得到它。

我的父母有很多孩子。我创建了一个视图,可以让我得到所有父母的孩子。现在我想结束该列表并使用新的子列表对父进行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

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

  1. 获取提交的孩子validated_data.pop('children')
  2. 循环遍历它们并将每一个添加到parent.children多对多
  3. 保存父模型
  4. 我可能在这里尝试了十几个不同的想法,但我似乎无法让这个想法发挥作用。上面的代码不会改变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":&# 34;汤姆""姓氏":"琼斯"" DATE_OF_BIRTH" :" 1969年3月14日"}]

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

转到此处以简单解决该问题。它不涉及重写更新方法,因此在使用M2M的序列化程序中通用:

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

键是实例化序列化程序,并传递实例,数据字典和partial=True标志,以便给定的任何字段都可以更新,除了主键。