如何通过Django Model查询获取关联表字段信息?
Django外键关联表查询无法获取关联详情的解决方案
你使用serializers.serialize查询TblVersion时,即便添加了select_related(),返回的JSON仍只包含外键ID,缺失关联的project_name字段。这是因为Django默认序列化器仅处理当前模型字段,不会自动序列化外键关联对象的字段,哪怕已经预加载了关联数据。
以下两种方法可解决这个问题:
方法一:手动构造数据字典
利用select_related('project')预加载的关联对象,遍历查询结果并手动组装包含所有所需字段的字典,再转换为JSON:
import json # 预加载关联的project数据,避免N+1查询 result = TblVersion.objects.all().select_related('project') data_list = [] for version in result: data_dict = { "Version Id": version.version_id, "Major Version": version.version_major, "Minor Version": version.version_minor, "Project Id": version.project.project_id, "Project Name": version.project.project_name } data_list.append(data_dict) # 转换为格式化的JSON字符串 data = json.dumps(data_list, indent=2) print(data)
执行后将输出符合你期望结构的完整数据。
方法二:使用Django REST Framework序列化器(API场景推荐)
若你的项目是API服务,DRF序列化器能更灵活地处理关联字段,且结构更规范:
- 安装DRF(未安装时执行):
pip install djangorestframework
- 在应用目录下创建
serializers.py,定义序列化器:
from rest_framework import serializers from .models import TblVersion, TblProject class TblProjectSerializer(serializers.ModelSerializer): class Meta: model = TblProject fields = ['project_id', 'project_name'] class TblVersionSerializer(serializers.ModelSerializer): project = TblProjectSerializer() class Meta: model = TblVersion fields = ['version_id', 'version_major', 'version_minor', 'project'] # 重写方法调整输出结构为扁平格式,匹配你期望的字段名 def to_representation(self, instance): representation = super().to_representation(instance) project_data = representation.pop('project') representation.update({ "Project Id": project_data['project_id'], "Project Name": project_data['project_name'] }) # 重命名字段 representation["Version Id"] = representation.pop('version_id') representation["Major Version"] = representation.pop('version_major') representation["Minor Version"] = representation.pop('version_minor') return representation
- 在代码中使用序列化器:
import json from .serializers import TblVersionSerializer result = TblVersion.objects.all().select_related('project') serializer = TblVersionSerializer(result, many=True) data = json.dumps(serializer.data, indent=2) print(data)
此方法输出的JSON结构完全符合你的需求。
内容的提问来源于stack exchange,提问作者Avijit Naskar
相关产品推荐
相关产品推荐

