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

完全丢失:在Django Rest框架中使用序列化程序和更新的多对多,django,django-rest-framework,vue.js,Django,Django Rest Framework,Vue.js,我已经研究这个问题好几个小时了,现在还没有找到解决方案。我就是不明白 我的父母有很多孩子。我创建了一个视图,允许我获取父对象的所有子对象。现在我想结束这个列表,并用新的子列表对父对象进行修补。我知道我需要编写一个自定义的update方法,但我不知道如何实现这一点 以下是我的子序列化程序: class ChildSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = models.Ch

我已经研究这个问题好几个小时了,现在还没有找到解决方案。我就是不明白

我的父母有很多孩子。我创建了一个视图,允许我获取父对象的所有子对象。现在我想结束这个列表,并用新的子列表对父对象进行修补。我知道我需要编写一个自定义的
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
这是我的父序列化程序:

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\u data.pop('children')
  • 循环遍历它们,并将每一个添加到parent.children多对多
  • 保存父模型
  • 我可能在这里尝试了十几个不同的想法,但我似乎无法让它发挥作用。上面的代码不会更改子项集

    欢迎提出任何建议

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

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

    更新:

    [{“id”:2,“url:”,“名”:“汤姆”,“姓”:“琼斯”,“出生日期”
    :“1969-03-14”}]

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

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

    到这里来寻找这个问题的简单解决方案。它不涉及重写更新方法,因此在使用M2M的序列化程序中是通用的:


    键实例化序列化程序,传递实例、数据字典和
    partial=True
    标志,以便更新除主键以外的所有给定字段。

    提交的子项是否包含预期值?我是说在更新方法中。你把它打印出来了吗?请原谅我的无知,但你说的“打印出来”是什么意思?打印(提交给孩子们)还是其他任何调试方式。当我做补丁的时候,它是空的!我发送API的方式不知道该放在哪里。作为补丁,它只会给孩子们写信。是吗?按照您创建
    update
    方法的方式,它只会编写子对象。