序列化错误:类型不正确。预计pk值,收到帖子

时间:2017-01-29 20:21:37

标签: django django-rest-framework

我正在尝试使用嵌套序列化创建一个对象,以便创建与其相关的其他对象。我已经覆盖了ModelSerializer的 create()方法,并且主对象已成功创建。

    def create(self, validated_data):
        post_data = validated_data.pop('post_set')
        big_post = BigPost.objects.create(**validated_data) // This works
        for post in post_data:
            e = PostSerializer(data=post)
            if e.is_valid():
                e.save()
            else:
                print(e.errors) // Prints 'Incorrect type' error
        return big_post

但是,在尝试创建嵌套对象(Post)时,我收到此错误:

  

{'note':['错误的类型。预期的pk值,收到注意。']}

'note'是PostSerializer的一个字段,如下所示:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('id', 'note', 'title', 'description')

我知道ModelSerializer的默认行为是为模型的任何相关字段创建PrimaryKeyRelatedField。但是,我不知道为什么在提交的数据只是像这样的PK时创建一个实例:{“note”:3,....}

1 个答案:

答案 0 :(得分:1)

如果您的序列化程序定义正确,则您不需要第二次反序列化validated_data。

文档:http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations

试试这段代码:

class PostSerializer(serializers.ModelSerializer):
    ...

class BigPostSerializer(serializers.ModelSerializer):
    posts = PostSerializer(source='post_set', many=True)

    def create(self, validated_data):
        post_data = validated_data.pop('post_set')
        big_post = BigPost.objects.create(**validated_data)

        for post in post_data:
            e = Post.objects.create(bigpost=big_post, **post)

        return big_post

bigpost - 是BigPost的外键名称。