在GET请求中检索相关字段的对象,否则仅使用POST,PUT,DELETE等对象的ID

时间:2017-01-23 11:25:42

标签: python django rest django-rest-framework django-serializer

我有两个序列化程序。文章中的“类别”字段是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正在尝试创建新类别。

如何解决这个问题?

1 个答案:

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