如何在Django序列化中仅输出关联嵌套模型的单个字段(只读)
实现序列化多对多字段为关联模型的title字段
我给你整理了几种实用的方法,都能轻松实现你想要的效果:
方法一:用StringRelatedField快速实现
这是最省心的方式,不过前提是你得先给Tag模型加上__str__方法,让它返回title字段:
# models.py class Tag(models.Model): title = models.CharField(max_length=255, unique=True) def __str__(self): return self.title # 让模型的字符串表示返回title
接着修改你的SceneSerializer,把tags字段指定为StringRelatedField,并且加上many=True(因为是多对多关系):
# serializers.py from rest_framework import serializers from .models import Scene class SceneSerializer(serializers.ModelSerializer): tags = serializers.StringRelatedField(many=True) class Meta: model = Scene fields = ('id', 'title', 'tags',) read_only_fields = ('tags',)
这样序列化后,tags就会直接返回["3D", "Industry"]这种字符串列表了,完全符合你的预期。
方法二:用SerializerMethodField自定义逻辑
如果不想修改模型的__str__,或者需要更灵活的处理(比如过滤某些标签),可以用自定义方法字段:
class SceneSerializer(serializers.ModelSerializer): tags = serializers.SerializerMethodField() # 命名必须是get_字段名的格式 def get_tags(self, obj): # 遍历当前Scene关联的所有Tag,提取title组成列表 return [tag.title for tag in obj.tags.all()] class Meta: model = Scene fields = ('id', 'title', 'tags',) read_only_fields = ('tags',)
这种方式自由度很高,你可以在get_tags里加任何逻辑,比如只返回包含特定关键词的标签title。
方法三:嵌套序列化器(适合后续扩展)
如果之后可能需要给Tag返回更多字段(比如id+title),可以先定义一个极简的Tag序列化器,再嵌套进去:
class TagTitleSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = ('title',) class SceneSerializer(serializers.ModelSerializer): tags = TagTitleSerializer(many=True, read_only=True) class Meta: model = Scene fields = ('id', 'title', 'tags',) read_only_fields = ('tags',)
不过要注意,这种方式返回的是字典列表:[{"title": "3D"}, {"title": "Industry"}],如果只需要纯字符串列表,前两种方法更贴合你的需求。
内容的提问来源于stack exchange,提问作者Philipp Mildenberger
相关产品推荐
相关产品推荐

