我试图在DRF 3中创建一个引用应用程序来演示可以创建/更新模型的嵌套序列化程序。在尝试创建嵌套模型时,**后面带有“*create()参数的下面的示例代码必须是映射,而不是list*”。我也不清楚该如何处理.update(),因为在某些情况下,我只想建立额外的关系(人员)。
示例模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
persons = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
以及序列化程序和视图集:
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import ModelViewSet
from app.models import Group, Person
class PersonSerializer(ModelSerializer):
class Meta:
model = Person
class GroupSerializer(ModelSerializer):
persons = PersonSerializer(many=True)
def create(self, validated_data):
persons = validated_data.pop('persons')
group = Group.objects.create(**validated_data)
if persons: # Bombs without this check
Person.objects.create(group=group, **persons) # Errors here
return group
class Meta:
model = Group
class PersonModelViewSet(ModelViewSet):
serializer_class = PersonSerializer
queryset = Person.objects.all()
class GroupModelViewSet(ModelViewSet):
serializer_class = GroupSerializer
queryset = Group.objects.all()
我试图发布一些JSON,插入一个包含两个(相关)人员的组:
{
"persons": [
{ "name" : "name 1" },
{ "name" : "name 2" }
],
"name": "group name 1"
}
我不知道是否有更简单的方法,但我成功实现这一点的唯一方法是引用组序列化程序中的“through”模型“memberships”,并为.create()和.update()编写自定义代码。如果有人知道更好的方法,我很乐意听到。
因此,您可以使用以下方法创建一个包含相关人员的新组:
使用此处显示的
PrimaryKeyRelatedField
:http://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield
例如,首先创建每个人。ID为1的人,Name=“Bob”。ID为2的人,Name=“Tim”。然后使用它们的
primary keys
将它们发布到REST端点,这样:现在你之前创建的人,都是这个组的一部分。
相关问题 更多 >
编程相关推荐