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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:06:24