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 框架模型序列化器 - 读取嵌套,写入平面