Django Rest 框架:允许在父模型内或单独创建子模型



假设我有一组嵌套的序列化器,如下所示:

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字段(因为您同时创建两个模型(。

有没有办法解决这种行为?我想为ParentChild创建方法,但我似乎无法配置我的序列化器来执行此操作。

编辑:

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。

相关内容

最新更新