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

在Django中基于三个模型实现Left Join的方法咨询

Django实现指定Left Join查询方案

完全可以实现你需要的Left Join查询,下面提供两种常用方法:

方法一:使用Django ORM(推荐)

Django ORM支持通过跨表关联语法实现Left Join,无需手写SQL,且能自动适配模型变化。

实现代码

# 直接通过values()指定需要的字段,利用双下划线跨表关联
queryset = ModelA.objects.values(
    'id', 'name',          # ModelA的字段
    'modelb__extra',       # ModelB的extra字段,通过反向关联(ModelA→ModelB)
    'modelb__c_id__number' # ModelC的number字段,通过ModelB关联(ModelB→ModelC)
)

# 遍历结果,每个元素是字典,对应SQL查询的一行数据
for item in queryset:
    print(item)
    # 输出示例:{'id': 1, 'name': 'test', 'modelb__extra': 'xxx', 'modelb__c_id__number': '123'}
    # 若ModelA无对应ModelB,extra和number会是None

说明

  • 反向关联默认生成LEFT OUTER JOIN,和你需要的SQL逻辑一致
  • 如果一个ModelA对应多个ModelB,会返回多条记录(和原生SQL结果一致)
  • 字段名中的双下划线__表示跨表关联,modelb__extra等价于SQL中b.extra

方法二:使用原生SQL

如果需要完全复用你的SQL语句,可以直接执行原生SQL:

实现代码

from django.db import connection

# 注意:Django默认表名为「app名称_模型名称小写」,比如你的app叫myapp,表名是myapp_a、myapp_b、myapp_c
# 可通过Model._meta.db_table查看实际表名,比如ModelA._meta.db_table
with connection.cursor() as cursor:
    cursor.execute("""
        SELECT a.*, b.extra, c.number
        FROM myapp_a a
        LEFT JOIN myapp_b b ON a.id = b.a_id 
        LEFT JOIN myapp_c c ON c.id = b.c_id
    """)
    # 获取查询结果的字段名
    columns = [col[0] for col in cursor.description]
    # 将结果转换为字典列表,方便使用
    results = [dict(zip(columns, row)) for row in cursor.fetchall()]

# 输出结果
for result in results:
    print(result)

说明

  • 必须确保表名和Django生成的一致,避免查询报错
  • 原生SQL灵活性更高,但需要手动维护表结构变化,若有动态参数需用参数化查询防止SQL注入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:57:33