Django Rest Framework - 发布到包含外键值

时间:2016-01-19 19:08:01

标签: python django django-rest-framework

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')  

1 个答案:

答案 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')