我有两个序列化程序。文章中的“类别”字段是ForeignKey。
我想在执行GET请求时完全检索类别对象。当我发出POST,PUT或DELETE请求时,我想只使用该类别的ID。
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('pk', 'name', 'slug')
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('pk', 'title', 'slug', 'body', 'category')
depth = 1
如果我将“depth = 1”属性添加到Meta类,那么我将获得类别对象。没关系。
但是,如果我尝试添加新文章(通过POST请求),我会收到此错误:
IntegrityError at /api/articles
NOT NULL constraint failed: panel_article.category_id
如果我尝试定义一个CategorySerializer字段,而不是像这样使用'depth'属性:
class ArticleSerializer(serializers.ModelSerializer):
category = CategorySerializer()
class Meta:
model = Article
fields = ('pk', 'title', 'slug', 'body', 'category')
由于类别字段,我收到此错误:
"Invalid data. Expected a dictionary, but got int."
当我尝试创建新文章时,我想DRF正在尝试创建新类别。
如何解决这个问题?
答案 0 :(得分:3)
这是一个常见问题,每当您想要更改表示行为时,您都可以使用序列化程序的to_representation
方法:
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Provider
fields = ('pk', 'title', 'slug', 'body', 'category')
def to_representation(self, instance):
representation = super(ArticleSerializer, self).to_representation(instance)
representation['category'] = CategorySerializer(instance.category).data
return representation