序列化错误:类型不正确。预期pk值,收到Post

zub*_*hav 5 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
Run Code Online (Sandbox Code Playgroud)

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

{'注意':['类型不正确。预期 pk 值,收到注意。']}

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

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('id', 'note', 'title', 'description')
Run Code Online (Sandbox Code Playgroud)

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

Dmi*_*aev 1

如果您的序列化程序定义正确,则无需第二次反序列化 valid_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
Run Code Online (Sandbox Code Playgroud)

bigpost - 是 BigPost 的外键名称。