假设我有一组嵌套的序列化器,如下所示:
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = models.Child
fields = ['id', 'name']
class ParentSerializer(serializers.ModelSerializer):
children = ChildSerializer(many=True)
class Meta:
model = models.Parent
fields = ['id', 'name', 'children']
def create(self, validated_data):
children = validated_data.pop('children')
parent = super().create(validated_data)
for child in children:
child['parent'] = parent
self.fields['children'].create(children)
return parent
如果我将有效载荷发送到ParentViewSet
:
payload = {
'name': 'parent',
'children': [
{
'name': 'child',
}
],
}
它可以很好地创建两个模型,但是如果我将以下有效负载发送到ChildViewSet
:
payload = {
'name': 'child',
'parent': parent.pk,
}
它将失败,因为它parent
不包含在Child
序列化程序field
属性中。如果包含该属性,则反之亦然。第二个有效负载有效,但第一个有效负载失败,因为您没有包含parent
字段(因为您同时创建两个模型(。
有没有办法解决这种行为?我想为Parent
和Child
创建方法,但我似乎无法配置我的序列化器来执行此操作。
编辑:
models.py
class Parent(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=256)
class Child(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=256)
parent = models.ForeignKey(Child, on_delete=models.CASCADE, related_name='children')
您可以使用另一个序列化程序来实现您想要的,如 JPG 在注释中所示。一种方法如下:
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = models.Child
fields = ['id', 'name', 'parent']
class ParentChildSerializer(serializers.ModelSerializer):
class Meta:
model = models.Child
fields = ['id', 'name']
class ParentSerializer(serializers.ModelSerializer):
children = ParentChildSerializer(many=True)
class Meta:
model = models.Parent
fields = ['id', 'name', 'children']
def create(self, validated_data):
children = validated_data.pop('children')
parent = super().create(validated_data)
for child in children:
child['parent'] = parent
self.fields['children'].create(children)
return parent
在 ChildViewSet 中,您可以使用 ChildSerializer,在 ParentSerializer 中,您可以使用 ParentChildSerializer。