Django REST Framework如何获取外键关联表值而非外键ID
Django 序列化返回外键关联字段文本值解决方案
问题核心原因
你当前配置出现异常有两个核心诱因:
- Product模型中外键字段命名为
status_id,ORM层面关联的status_lookup实例属性名就是status_id,你在序列化器中声明的status字段未指定数据源,默认查找product实例不存在的status属性,自然返回空值。 - 嵌套序列化器默认会返回关联表的完整结构化数据,而非你预期的单个字符串值,和需求不匹配。
最优实现方案(推荐)
直接使用DRF原生提供的SlugRelatedField,既可以实现返回关联表name字段的需求,还能完整保留原生校验逻辑,写操作时传入name值会自动校验对应关联记录是否存在:
class product_serializer(serializers.ModelSerializer): status = serializers.SlugRelatedField( slug_field='name', # 若仅需读接口可替换为read_only=True queryset=status_lookup.objects.all(), # 绑定模型中实际的外键字段作为数据源 source='status_id' ) class Meta: model = product fields = ('id','name','status')
其他可选实现方案
如果仅需支持读接口,还有更简化的写法,直接指定数据源到关联对象的name属性即可:
class product_serializer(serializers.ModelSerializer): status = serializers.CharField(source='status_id.name', read_only=True) class Meta: model = product fields = ('id','name','status')
如果坚持使用自定义to_representation方法,正确写法如下:
class product_serializer(serializers.ModelSerializer): class Meta: model = product fields = ('id','name','status') def to_representation(self, instance): data = super().to_representation(instance) data['status'] = instance.status_id.name return data
补充优化建议:Django模型外键命名无需刻意加
_id后缀,ORM会自动为存储外键ID的数据库列追加_id后缀,模型层面直接命名为status会让代码可读性更高,也能避免本次字段名匹配的问题。
内容的提问来源于stack exchange,提问作者conol
相关产品推荐
相关产品推荐

