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

Django REST Framework多对多分类字段:显示标题而非ID

解决DRF中ManyToMany字段返回自定义格式的问题

针对你需要将category字段从ID数组改为"Category title(id)"格式的需求,提供两种实用解决方案:

方案1:使用SerializerMethodField快速实现

直接在序列化器中自定义字段逻辑,灵活控制输出格式:

class PostSerializer(serializers.ModelSerializer):
    author = serializers.CharField(source='author.email', read_only=True)
    # 自定义category字段的序列化逻辑
    category = serializers.SerializerMethodField()

    def get_category(self, obj):
        # 遍历关联的Category实例,拼接成目标格式
        return [f"{category.title}({category.id})" for category in obj.category.all()]

    class Meta:
        model = BlogPostModel
        fields = ['author','category','title','body','slug','background_image','created_date']

方案2:自定义关联字段类(适合复用场景)

如果多个序列化器都需要这种格式的Category输出,可以封装成独立字段类,提升代码复用性:

# 自定义字段类
class CategoryTitleWithIdField(serializers.RelatedField):
    def to_representation(self, value):
        return f"{value.title}({value.id})"

class PostSerializer(serializers.ModelSerializer):
    author = serializers.CharField(source='author.email', read_only=True)
    # 使用自定义字段处理category
    category = CategoryTitleWithIdField(many=True, read_only=True)

    class Meta:
        model = BlogPostModel
        fields = ['author','category','title','body','slug','background_image','created_date']

补充说明

  • 以上两种方案均为只读序列化,如果需要支持创建/更新时接收Category的ID,可额外添加用于写入的字段(比如保留原category字段用于写入,新增category_display字段用于读出)。
  • 若仅需要返回Category的title而不需要ID,可直接使用serializers.StringRelatedField(many=True),它会调用Category模型的__str__方法返回内容。

内容的提问来源于stack exchange,提问作者Whomannn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:29:52