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

