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

如何通过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序列化器能更灵活地处理关联字段,且结构更规范:

  1. 安装DRF(未安装时执行):
pip install djangorestframework
  1. 在应用目录下创建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
  1. 在代码中使用序列化器:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:40:22