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

Django REST Framework中外键字段返回ID而非对应名称的问题排查求助

解决DRF序列化器返回外键ID而非关联对象名称的问题

嘿,我太懂你这个困扰了!在Django REST Framework里,ModelSerializer处理外键字段时,默认只会返回关联对象的主键ID,这是框架的默认行为,不是你代码写错了哦~下面给你几个简单的解决办法,按需选就行:

方法1:用StringRelatedField直接返回名称(最简单)

如果你的Pricing模型已经在__str__方法里返回了它的名称(比如def __str__(self): return self.name),那这个方法最省事,只需要修改你的UserSubscriptionSerializer:

class UserSubscriptionSerializer(serializers.ModelSerializer):
    # 新增这一行,让pricing返回__str__对应的内容
    pricing = serializers.StringRelatedField()
    class Meta:
        model = Subscription
        fields = ("user", "pricing", "status", )

⚠️ 注意:这个字段是只读的,如果你的接口需要支持修改pricing字段,这个方法就不适用了,得看下面的方案。

方法2:嵌套序列化器返回更多Pricing信息

如果你不仅需要返回名称,还想带上Pricing的其他字段(比如价格、描述之类的),可以给Pricing单独写一个序列化器,然后嵌套进去:

# 先定义Pricing的序列化器,按需选择要返回的字段
class PricingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Pricing
        fields = ("id", "name", "price")  # 把你需要的字段加进来,name就是你要的名称

class UserSubscriptionSerializer(serializers.ModelSerializer):
    # 嵌套Pricing序列化器
    pricing = PricingSerializer()
    class Meta:
        model = Subscription
        fields = ("user", "pricing", "status", )

这个方法同样默认是只读的,如果需要支持更新操作,你得在序列化器里额外处理嵌套对象的更新逻辑,或者给PricingSerializer加上read_only=False(前提是前端传入的数据格式符合要求)。

方法3:自定义字段(适合特殊场景)

如果上面两种都满足不了你的需求,还可以自定义一个字段来控制返回内容:

class PricingNameField(serializers.Field):
    def to_representation(self, value):
        # value就是关联的Pricing对象,直接返回你要的名称字段
        return value.name

class UserSubscriptionSerializer(serializers.ModelSerializer):
    pricing = PricingNameField()
    class Meta:
        model = Subscription
        fields = ("user", "pricing", "status", )

这种方式灵活性最高,你可以在to_representation里写任何你需要的逻辑来返回展示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:42:42