如何在Django中通过单条查询语句实现多模型联合查询
Django多模型关联查询实现方案
前提:模型关联配置
首先要确保三个模型配置了正确的关联关系,示例模型定义如下:
from django.db import models class Person(models.Model): # 按需补充Person表的其他字段 class Meta: db_table = 'PERSON' class Department(models.Model): unit = models.CharField(max_length=100, primary_key=True) # 按需补充Department表的其他字段 class Meta: db_table = 'DEPARTMENT' class Employee(models.Model): # 一对一关联Person表,ID字段作为外键 person = models.OneToOneField(Person, on_delete=models.CASCADE, primary_key=True, db_column='ID') # 外键关联Department表的unit字段 department = models.ForeignKey(Department, on_delete=models.CASCADE, db_column='UNIT') # 按需补充Employee表的其他字段 class Meta: db_table = 'EMPLOYEE'
这里把关联字段命名为person和department是为了后续调用更直观,不需要和原SQL的字段名保持一致,只要指定db_column为实际表的字段名即可。
实现查询的两种方案
方案1:ORM关联查询(推荐)
用Django ORM的select_related方法一次性预取所有关联表的数据,等效于你给出的联表SQL,性能和原生SQL基本一致:
# 替换为你要查询的员工ID target_id = 1 employee = Employee.objects.select_related("person", "department").get(id=target_id)
你可以直接通过对象属性拿到三个表的所有字段:
- 员工表字段:
employee.xxx - 关联的人员表字段:
employee.person.xxx - 关联的部门表字段:
employee.department.xxx
方案2:原生SQL查询(适配无外键关联场景)
如果你的表是旧系统遗留表,无法修改模型添加外键关联,可以直接用Django的raw方法执行原生SQL:
sql = """ SELECT DEPARTMENT.*,EMPLOYEE.*,PERSON.* FROM EMPLOYEE,DEPARTMENT,PERSON WHERE EMPLOYEE.ID = %s AND PERSON.ID = EMPLOYEE.ID AND EMPLOYEE.UNIT = DEPARTMENT.UNIT """ # 替换为你要查询的员工ID target_id = 1 result = Employee.objects.raw(sql, [target_id])
遍历result即可获取所有关联字段,注意如果三个表有重名字段,写SQL时可以给重名字段加别名避免被覆盖。
内容的提问来源于stack exchange,提问作者Hritvik Agarwal
相关产品推荐
相关产品推荐

