Django rest 框架序列化程序返回一个列表而不是 json

Posted

技术标签:

【中文标题】Django rest 框架序列化程序返回一个列表而不是 json【英文标题】:Django rest framework serializer return a list instead of json 【发布时间】:2016-01-16 16:37:13 【问题描述】:

我有以下标签并以多对多的关系发布对象。我尝试在后序列化程序中返回的是返回列表中的标签(仅使用 Tag.name)而不是 json,这样做的干净方法是什么?

serializers.py

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ('name', 'description', 'date_created', 'created_by')

class PostSerializer(serializers.ModelSerializer):
    tags = TagSerializer(read_only=True, many=True)

    class Meta:
        model = Post
        fields = ('post_id',
                  'post_link',
                  'tags')

目前,PostSerializer 以 json 格式返回所有字段的标签,我只希望它在字符串列表中返回标签:['tag1', 'tag2', 'tag3']。

【问题讨论】:

【参考方案1】:

对你来说一个非常简单的解决方案可能是改变它

tags = TagSerializer(read_only=True, many=True)

进入这个

tags = TagSerializer(read_only=True, many=True).data

这会将您的标签列为 id,而不是列出每个标签的所有属性

【讨论】:

【参考方案2】:

一种方法是:

class PostSerializer(serializers.ModelSerializer): 
    tags = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ('post_id', 'post_link', 'tags')

    def get_tags(self, post):
        return post.tags.values_list('name', flat=True)

第二种方法是使用 Post 模型上的属性:

class Post(models.Model):
    ....

    @property
    def tag_names(self):
        return self.tags.values_list('name', flat=True)


class PostSerializer(serializers.ModelSerializer): 
    tag_names = serializers.ReadOnlyField()

    class Meta:
        model = Post
        fields = ('post_id', 'post_link', 'tag_names')

【讨论】:

以上是关于Django rest 框架序列化程序返回一个列表而不是 json的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖与响应 django rest framework 序列化程序一起返回的返回序列化程序对象

Django rest框架 - 模型序列化程序不会序列化所有字段

完全迷失:在 Django Rest 框架中使用序列化器和更新的多对多

django rest 框架模型序列化器 - 读取嵌套,写入平面

Django Rest Framework - 在序列化程序中获取相关模型字段

如何在 django rest 框架中为枚举字段创建序列化程序