DRF的新功能,到目前为止,它一直非常有用,文档也是如此。但是,我试图了解这应该如何工作。我基本上试图在POST
创建一个具有外键关联字段reputation
的新mentionid
对象。 mentionid
已经存在。
信誉对象正确表示,如下所示:
{
"id": 5,
"author": 1,
"authorname": "name",
"value": 100,
"mentionid": {
"id": 1,
"author": 1,
"somekey": "some value"
}
}
但是当我发布时,我收到此错误:
The `.create()` method does not support writable nestedfields by default.
Write an explicit `.create()` method for serializer `quickstart.serializers.ReputationSerializer`, or set `read_only=True` on nested serializer fields.
我假设我需要在序列化程序中定义一个创建方法,但出于好奇,我注意到如果我注释掉引用MentionSerializer
的行我可以成功发布mentionid
字段,但是它返回一个只有mentionid
外键值的对象,这不是我想要的。所以我很好奇我是否错过了我的模型中可以解决我的问题的参数。也许我需要在我的模型中的外键上设置默认值?感谢任何见解。
{
"id": 5,
"author": 1,
"authorname": "name",
"value": 100,
"mentionid": 1
}
我的模型有一个声誉类:
class Reputation(models.Model):
mentionid = models.ForeignKey(Mention)
我有一个序列化器:
class ReputationSerializer(serializers.ModelSerializer):
mentionid = MentionSerializer()
class Meta:
model = Reputation
fields = ('id', 'author', 'authorname', 'value', 'mentionid')
答案 0 :(得分:1)
所以我想出了一个使用PrimaryKeyRelatedField
的解决方案这里的想法是让一个字段child_id
是只写的,它接受一个设置mentionid
源
class ReputationSerializer(serializers.ModelSerializer):
mentionid = MentionSerializer()
child_id = serializers.PrimaryKeyRelatedField(queryset=Mention.objects.all(), source='mentionid', write_only=True)
class Meta:
model = Reputation
fields = ('id', 'author', 'authorname', 'value', 'mentionid', 'child_id', 'created_date', 'published_date')