如何让Django序列化器返回ManyToMany字段的title而非ID?
解决Django序列化ManyToMany字段为关联对象title列表的方法
方法一:使用SerializerMethodField
通过自定义序列化字段,手动提取关联对象的title字段组成列表,灵活性更高,适合需要额外处理字段的场景。
from rest_framework import serializers from .models import Client class ClientSerializer(serializers.ModelSerializer): basket = serializers.SerializerMethodField() class Meta: model = Client fields = ['id', 'name', 'basket'] # 按需调整实际字段 def get_basket(self, obj): # 遍历关联的Position实例,提取title生成列表 return [position.title for position in obj.basket.all()]
方法二:使用StringRelatedField
此方法依赖关联模型的__str__方法返回值,需先确保Position模型的__str__返回title字段。
首先修改Position模型:
from django.db import models class Position(models.Model): title = models.CharField(max_length=100) # 其他字段... def __str__(self): return self.title
然后在序列化器中直接使用StringRelatedField:
from rest_framework import serializers from .models import Client class ClientSerializer(serializers.ModelSerializer): basket = serializers.StringRelatedField(many=True) class Meta: model = Client fields = ['id', 'name', 'basket']
注意事项
- 使用
StringRelatedField时,必须保证Position的__str__方法返回的是需要的title,否则会出现不符合预期的结果。 - 如果需要对
title做格式化、过滤等额外处理,优先选择SerializerMethodField。
内容的提问来源于stack exchange,提问作者Serg
相关产品推荐
相关产品推荐

