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

Django中如何通过ForeignKey关联多表,用ORM按EMP_CODE单查询取指定字段

Django ORM 跨三张表单次查询实现方案

三张表为正向 ForeignKey 级联关联结构,使用 select_related 即可实现单次SQL查询,直接获取三个表的指定字段,以下是两种常用写法:

写法1:返回字典格式(直接拿到目标字段)

from django.db.models import F
from .models import EMPLOYEE_COMPANY_DETAILS

# 替换为你实际的EMP_CODE取值
target_emp_code = "你的EMP_CODE值"

query_result = EMPLOYEE_COMPANY_DETAILS.objects.filter(
    # 若你是用Employee表的EMP_CODE过滤,替换为 EMP_LINK__EMP_LINK__EMP_CODE=target_emp_code
    EMP_CODE=target_emp_code
).select_related(
    # 级联关联两张上层表
    "EMP_LINK", "EMP_LINK__EMP_LINK"
).annotate(
    # 给目标字段设置别名,避免字段名过长
    emp_name=F("EMP_LINK__EMP_LINK__EMP_NAME"),
    emp_address=F("EMP_LINK__EMP_ADDRESS"),
    company_name=F("EMP_COMPANY_NAME")
).values(
    "emp_name", "emp_address", "company_name"
).first()

# 取值示例
print(query_result["emp_name"], query_result["emp_address"], query_result["company_name"])

写法2:返回模型对象格式

如果你需要操作模型对象而非纯字段值,可以用only限定要查询的字段:

from .models import EMPLOYEE_COMPANY_DETAILS

target_emp_code = "你的EMP_CODE值"

emp_detail_obj = EMPLOYEE_COMPANY_DETAILS.objects.filter(
    EMP_CODE=target_emp_code
).select_related(
    "EMP_LINK", "EMP_LINK__EMP_LINK"
).only(
    "EMP_COMPANY_NAME", "EMP_LINK__EMP_ADDRESS", "EMP_LINK__EMP_LINK__EMP_NAME"
).first()

# 取值示例
print(emp_detail_obj.EMP_LINK.EMP_LINK.EMP_NAME)
print(emp_detail_obj.EMP_LINK.EMP_ADDRESS)
print(emp_detail_obj.EMP_COMPANY_NAME)

额外提示:你当前的模型定义缺少ForeignKey必填的on_delete参数,Django 2.x及以上版本会直接报错,建议补充,比如EMP_LINK = models.ForeignKey(Employee, on_delete=models.CASCADE);另外Django模型类名规范为大驼峰命名,不推荐全大写写法。

内容的提问来源于stack exchange,提问作者singa raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:03