You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:09:40