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
相关产品推荐
相关产品推荐

