我是一个像这样的简单序列化器:
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。
答案 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