Python 如何在django rest嵌套序列化程序中使字段可选
我有这个密码Python 如何在django rest嵌套序列化程序中使字段可选,python,json,django,django-rest-framework,Python,Json,Django,Django Rest Framework,我有这个密码 # Models class Parent(models.Model): something = models.CharField(max_length=255) class Child1(models.Model): thing = models.BooleanField() parent = models.ForeignKey(Parent) # Serializers class Child1Serializer
# Models
class Parent(models.Model):
something = models.CharField(max_length=255)
class Child1(models.Model):
thing = models.BooleanField()
parent = models.ForeignKey(Parent)
# Serializers
class Child1Serializer(BaseSerializer):
class Meta:
model = Child1
fields = ('thing', 'parent')
class Child2Serializer(BaseSerializer):
class Meta:
model = Child2
fields = ('thing', 'parent')
class ParentSerializer(BaseSerializer):
sisters = Child1Serializer(many=True)
cousins = Child2Serializer(many=True)
现在,当我在Child1中发布,然后在json中传递parent时,一切都正常了
但当我想编写父对象的嵌套序列化程序时,子对象也会自动创建
"sisters": [
{
"thing": "tom"
}
],
"cousins": [
{
"thing": "mike"
},
]
然后我不需要传递父对象,因为我将在create方法中手动分配
def create(self, validated_data):
sisters = validated_data.pop('sisters')
parent = Parent.objects.create(**validated_data)
for obj in sisters:
Child1.objects.create(parent=parent, **obj)
return parent
问题是,当我发布父项时,我会得到一个验证错误,即在sister中,父项是必需的您根本不需要嵌套序列化程序中的
父项
字段。它与发送到API的数据是冗余的。尝试使用django智能选择在创建父项之前,是否从验证的\u数据中弹出表兄妹?@Anush不,这只是一个示例。你的意思是我不需要子项序列中的父项?没错。它与父项有关,不是吗?请注意,通过编写“Child1.objects.create(parent=parent,**obj)”您已经提供了父项。没有理由来自嵌套子序列化程序的obj也会带来它。另外,Python会抱怨有两次相同的参数。你是对的。但如果我发布父对象来创建子对象,那么您的观点是有效的。但如果我只发布子项,那么父项将不在验证数据中,因为如果我没有在字段中定义它,序列化程序将删除它,而不是您的代码所显示的(parent=parent.objects.create(**validated_data))