我有一个嵌套的ModelSerializer
我无法验证。
我遇到的问题是,在创建父序列化程序时,我可能需要也可能不需要创建嵌套的序列化程序/模型,因为它可能已存在于数据库中,我只想链接到它。
代码设置:
class ModelA(models.Model):
modelb = ForeignKey(ModelB, null=true, blank=true)
...
class ModelB(models.Model):
...
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的目标没有帮助。
我该怎么做呢?我做错了什么?
答案 0 :(得分:1)
你可以试试这个:
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}, }