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

Django REST Framework中如何让ManyToMany字段仅展示关联对象名称?

解决方案

这问题我熟,最简洁高效的方案是利用DRF自带的序列化字段直接提取语言名称,不需要嵌套完整的LanguageSerializer,给你两种最优实现方式:

方法一:使用StringRelatedField(推荐)

因为你的Language模型已经定义了__str__方法返回语言名称,StringRelatedField会自动调用模型的__str__方法生成字段值,完美适配这种场景:

from languages.models import Language, Paradigmn, Programmer
from rest_framework import serializers

class ProgrammerSerializer(serializers.ModelSerializer):
    # 用StringRelatedField替代嵌套的LanguageSerializer,many=True处理多对多关系
    languages = serializers.StringRelatedField(many=True)
    
    class Meta:
        model = Programmer
        fields = ('id', 'name', 'languages')

方法二:手动指定字段来源(不依赖__str__)

如果不想依赖模型的__str__方法,可以直接用ReadOnlyField指定数据源为name:

from languages.models import Language, Paradigmn, Programmer
from rest_framework import serializers

class ProgrammerSerializer(serializers.ModelSerializer):
    languages = serializers.ReadOnlyField(source='name', many=True)
    
    class Meta:
        model = Programmer
        fields = ('id', 'name', 'languages')

最终效果

修改后返回的JSON会变成你想要的格式,languages数组仅展示语言名称:

[
    {
        "id": 1,
        "name": "Ryan",
        "languages": ["Java"]
    },
    {
        "id": 2,
        "name": "Jean",
        "languages": ["Python"]
    },
    {
        "id": 3,
        "name": "Michael",
        "languages": ["Elixir"]
    }
]

这两种方法都比嵌套序列化器更轻量,减少了不必要的数据传输,是处理这类需求的最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:39