我有一个嵌套的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}, }

10-06 07:13