Django Rest Framework嵌套Serializer现有实例

时间:2015-09-18 19:48:52

标签: python django django-rest-framework django-1.8

我有一个嵌套的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并且它期待一个字典但是得到了一个N​​estedModel实例。

其次,如果我传递NestedModel(而不是对象)的数据:

data = {
    'nestedmodel': {'id': 'this', ... },
}

我得到的验证错误相当于重复键,因为嵌套模型有一个唯一键('id')并且已存在于数据库中。

第三,如果我只是传递了nestedmodel的id,我会在第一种情况下得到类似的错误,除了它说它有Unicode而不是NestedModel实例。

data = {
    'nestedmodel': 'this',
}

我理解为什么所有这三种情况都在发生并且验证失败,但这对我试图链接已经存在的NestedModel的目标没有帮助。

我该怎么做呢?我做错了什么?

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

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}, }