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

Django REST Framework中外键字段仅返回ID而非名称值的解决咨询

解决Django REST Framework中外键字段仅返回ID的问题

下面是几种常用的解决方法,按需选择即可:

方法1:使用StringRelatedField

如果外键模型(比如Country)已经在__str__方法中返回名称字段,直接用这个字段就能获取名称:

# serializer.py
from rest_framework import serializers
from .models import State, Country

class StateSerializer(serializers.ModelSerializer):
    # 直接返回Country对象__str__方法的返回值
    country = serializers.StringRelatedField()
    
    class Meta:
        model = State
        fields = ('id', 'name', 'country')

前提是Country模型的__str__要返回名称:

# models.py
class Country(models.Model):
    name = models.CharField(max_length=100)
    
    def __str__(self):
        return self.name

方法2:使用SlugRelatedField

直接指定要返回的外键模型字段,无需依赖__str__方法:

# serializer.py
class StateSerializer(serializers.ModelSerializer):
    country = serializers.SlugRelatedField(read_only=True, slug_field='name')
    
    class Meta:
        model = State
        fields = ('id', 'name', 'country')

这里的slug_field='name'表示返回Country模型中name字段的值。

方法3:嵌套序列化器

如果需要返回外键对象的多个字段(比如同时返回ID和名称),可以用嵌套序列化器:

# serializer.py
class CountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Country
        fields = ('id', 'name')

class StateSerializer(serializers.ModelSerializer):
    country = CountrySerializer(read_only=True)
    
    class Meta:
        model = State
        fields = ('id', 'name', 'country')

此时返回的country字段会是一个包含id和name的字典。

方法4:单独添加名称字段(保留原外键ID)

如果需要同时保留外键ID和显示名称,可以新增一个字段:

# serializer.py
class StateSerializer(serializers.ModelSerializer):
    country_name = serializers.CharField(source='country.name', read_only=True)
    
    class Meta:
        model = State
        fields = ('id', 'name', 'country', 'country_name')

这样返回的结果里既有country(ID),又有country_name(名称)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:27:19