完全迷失:Django Rest Framework 中带有序列化器和更新的多对多
Completely Lost: Many To Many with Serializers and Update in Django Rest Framework
我已经研究了几个小时了,但没有找到解决方案。我只是不明白。
我有一个 parent 有很多 children。我创建了一个视图,允许我获取所有 parent 的 children。现在我想结束该列表并使用 children 的新列表对 parent 进行 PATCH。我知道我需要编写一个自定义 update
方法,但我不知道如何实现它。
这是我的 Child 序列化程序:
class ChildSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Child
fields = ('id', 'url', 'name',)
这是我的 Parent 序列化程序:
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
我对需要发生的事情的理解是...
- 获取提交的children
validated_data.pop('children')
- 遍历它们并将每一个添加到parent.children多对多
- 保存 parent 模型
我可能在这里尝试了十几种不同的想法,但我似乎无法让它发挥作用。上面的代码不会改变 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"}]
我认为你的JSON不正确。它应该是这样的:
{
"id": 1,
"url": "some url",
"name": "John Smith",
"children": [
{"id": 2, "url": "child url", "name": "childs name"},
{"id": 3, ...}
]
}
转到此处获取问题的简单解决方案。它不涉及覆盖更新方法,因此在使用 M2M 的序列化程序中是通用的:
关键是实例化序列化程序,传递实例、数据字典和 partial=True
标志,以便更新除主键之外的任何给定字段。
我已经研究了几个小时了,但没有找到解决方案。我只是不明白。
我有一个 parent 有很多 children。我创建了一个视图,允许我获取所有 parent 的 children。现在我想结束该列表并使用 children 的新列表对 parent 进行 PATCH。我知道我需要编写一个自定义 update
方法,但我不知道如何实现它。
这是我的 Child 序列化程序:
class ChildSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Child
fields = ('id', 'url', 'name',)
这是我的 Parent 序列化程序:
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
我对需要发生的事情的理解是...
- 获取提交的children
validated_data.pop('children')
- 遍历它们并将每一个添加到parent.children多对多
- 保存 parent 模型
我可能在这里尝试了十几种不同的想法,但我似乎无法让它发挥作用。上面的代码不会改变 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"}]
我认为你的JSON不正确。它应该是这样的:
{
"id": 1,
"url": "some url",
"name": "John Smith",
"children": [
{"id": 2, "url": "child url", "name": "childs name"},
{"id": 3, ...}
]
}
转到此处获取问题的简单解决方案。它不涉及覆盖更新方法,因此在使用 M2M 的序列化程序中是通用的:
关键是实例化序列化程序,传递实例、数据字典和 partial=True
标志,以便更新除主键之外的任何给定字段。