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
相关产品推荐
相关产品推荐

