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

DRF序列化器如何返回外键字段值?技术求助

解决DRF API返回关联模型status_text的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是序列化器里的source路径写错了,另外还有几种更优雅的方式来获取关联模型的字段值,下面给你详细说明:

问题根源

你之前在序列化器里写的source='Status.status_text'是错误的——这里需要引用的是当前模型(SirTarget)的外键字段名sir_status,而不是关联模型的类名Status,正确的路径应该是sir_status.status_text。

可行解决方案

方案一:直接添加独立的status_text字段

这种方式会在返回结果里新增一个status_text字段,同时保留原有的sir_status主键字段:

class SirTargetStatusSerializer(serializers.ModelSerializer):
    # 注意source的路径是当前模型的外键字段 + 关联模型的字段
    status_text = serializers.ReadOnlyField(source='sir_status.status_text')
    
    class Meta:
        model = SirTarget
        # 可以用__all__,也可以明确列出需要的字段,避免冗余
        fields = ['id', 'name', 'first_name', 'last_name', 'entry_date', 'sir_status', 'status_text']

方案二:用StringRelatedField替换默认外键序列化

你的Status模型已经把__str__方法设为返回status_text,用StringRelatedField可以直接让外键字段返回这个字符串,而不是主键ID:

class SirTargetStatusSerializer(serializers.ModelSerializer):
    # 直接替换原有的sir_status字段序列化方式
    sir_status = serializers.StringRelatedField()
    
    class Meta:
        model = SirTarget
        fields = '__all__'

这样返回的sir_status字段值就是对应的状态文本(比如"New"、"Open"),而不是数字ID。

方案三:嵌套序列化器(适合需要多个关联字段的场景)

如果以后你需要返回Status模型的其他字段(比如status_open),嵌套序列化器会更灵活:

# 先定义Status的序列化器
class StatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = Status
        fields = ['status_text', 'status_open']

# 在SirTarget的序列化器里使用嵌套
class SirTargetStatusSerializer(serializers.ModelSerializer):
    sir_status = StatusSerializer(read_only=True)
    
    class Meta:
        model = SirTarget
        fields = '__all__'

这种方式返回的sir_status会是一个包含多个字段的对象,比如:

{
  "id": 1,
  "name": "示例工单",
  "first_name": "John",
  "last_name": "Doe",
  "entry_date": "2024-05-20T12:00:00Z",
  "sir_status": {
    "status_text": "New",
    "status_open": true
  }
}

验证效果

选好方案后,重启你的DRF服务,再调用API就能看到对应的status_text值正常返回了。你之前的数据库数据是正确的,所以只要序列化器配置正确,就能拿到想要的结果。

内容的提问来源于stack exchange,提问作者Bring Coffee Bring Beer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:52