我有一个嵌套的ModelSerializer
,无法验证。
我遇到的问题是在创建父序列化程序时,我可能需要创建嵌套的序列化程序/模型,因为它可能已存在于数据库中,所以我只想链接到它。
代码设置:
models.py
class ModelA(models.Model):
modelb = ForeignKey(ModelB, null=true, blank=true)
...
class ModelB(models.Model):
...
serializers.py
class ModelASerializer(serializers.ModelSerializer):
modelb = ModelBSerializer(required=False)
class Meta:
model = ModelA
depth = 1
class ModelBSerializer(serializers.ModelSerializer):
class Meta:
model = ModelB
因此,鉴于3种数据方案,我在全部3种数据上都遇到了验证错误。
首先,如果我像这样传递NestedModel作为数据
data = {
'nestedmodel': NestedModel(**args),
...
}
我收到验证错误,说有一个
non_field_error
,并且它正在等待字典,但有NestedModel实例。其次,如果我传递NestedModel的数据(而不是对象):
data = {
'nestedmodel': {'id': 'this', ... },
}
由于嵌套模型具有唯一键('id'),并且数据库中已经存在该错误,因此我得到了等同于重复键的验证错误。
第三,如果我只是将其传递给nestedmodel的id,我会得到与第一种情况类似的错误,除了它说它得到的是Unicode而不是NestedModel实例。
data = {
'nestedmodel': 'this',
}
我理解为什么所有这三种情况都在发生,并且验证失败了,但这对尝试链接已经存在的NestedModel的目标没有帮助。
我该怎么做呢?我究竟做错了什么?
最佳答案
你可以尝试一下:
serializers.py
class ModelASerializer(serializers.ModelSerializer):
modelb = ModelBSerializer(required=False)
class Meta:
model = ModelA
depth = 1
fields = ('id', 'modelb', )
def create(self, validated_data):
modelb_id = self.validated_data.pop("nestedmodel")
modelb = ModelB.objects.get(id=modelb_id["id"])
modela = ModelA.objects.create(modelb=modelb, **validated_data)
return modela
传递数据,如下所示:
输入项
data = {"nestedmodel": {"id": 1 # add nestedmodel fields here}, }