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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:04