我正在尝试使用嵌套序列化创建一个对象,以便创建与其相关的其他对象。我已经覆盖了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,....}
答案 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的外键名称。