django-rest-framework:来自DATA的序列化程序不会更新模型ID

时间:2014-11-22 11:35:04

标签: django django-rest-framework

我是一个像这样的简单序列化器:

class CategoryCreationSerializer(serializers.ModelSerializer):

    class Meta:
        model = Category

类别有一个id字段(Django主键),我不明白为什么Serializer没有更新它。

场景:我有一个给定类别的BlogPost。我用不同的类别(已在数据库上创建)更新BlogPost。因此,POST请求将包含具有更新ID的新Category JSON对象的所有BlogPost信息:

{
    "id": 1,
    "title": "My first blog post",
    "category": {
        "id": 3,
        "name": "Techology"
    }
}

问题在于,当我这样做时:

category_data = data.get('category')
    if category_data is not None:
        category_serializer = CategoryCreationSerializer(data=category_data)
        if category_serializer.is_valid():
            blog_post.category = category_serializer.object

内部类别标题将被更新,但id字段将为NONE。 你能解释一下为什么吗?

干杯,Emanuele。

2 个答案:

答案 0 :(得分:3)

默认情况下,由Django REST Framework is read-only自动生成的id字段。因此,id将始终为空,如果尚未附加Category,则会尝试创建新的id

您可以通过将自己的class CategoryCreationSerializer(serializers.ModelSerializer): id = serializers.IntegerField() class Meta: model = Category 字段添加到非只读序列化程序来覆盖此字段。

{{1}}

答案 1 :(得分:3)

这是django rest-framework git存储库issue I created的官方回答:https://github.com/tomchristie/django-rest-framework/issues/2114

  

简短的回答是,默认情况下,ModelSerializer会生成一个   id的只读字段。 (在通用视图中,您会看到   id由视图代码显式设置,基于URL中的id)   您将要在序列化程序上明确声明id字段   你可以把它写成读写。

所以我设法解决了我的问题,离开了我的问题中的串行器(没有id = serializers.IntegerField()

category_data = data.get('category', None)
if category_data is not None:
    category_serializer = CategoryCreationSerializer(blog_post.category, data=category_data)
    if category_serializer.is_valid():
        category_serializer.object.id = category_data.get("id", None)
        blog_post.category = category_serializer.object