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

