如何在Django中编写内连接查询?附模型与MySQL查询示例
在Django中实现学生与学院表的内连接查询
嗨,我来帮你搞定这个内连接查询的需求!先确认下你的模型结构(我把代码贴出来方便参考):
class students(models.Model): name = models.CharField(max_length=30) active = models.BooleanField(max_length=1) class college(models.Model): department = models.CharField(max_length=20) college_name = models.CharField(max_length = 50) s_id = models.ForeignKey(students, on_delete=models.CASCADE)
你给出的MySQL查询是要获取CSE部门对应的学生姓名和部门名称,下面给你几种贴合Django开发习惯的实现方式:
方法1:使用select_related(推荐,避免N+1查询)
因为college和students是多对一的关联关系,用select_related可以一次性拉取关联的students表数据,避免多次查询数据库,效率更高:
# 查询CSE部门的学生姓名和部门名称 queryset = college.objects.filter(department='CSE').select_related('s_id').values('s_id__name', 'department') # 遍历结果示例 for item in queryset: print(f"学生姓名: {item['s_id__name']}, 部门: {item['department']}")
这里select_related('s_id')会自动触发内连接操作,values指定我们需要的字段,s_id__name是Django ORM中跨表访问关联模型字段的标准写法。
方法2:从students表反向查询
如果你想从学生表出发,筛选出属于CSE部门的学生信息,也可以这样写:
from django.db.models import F queryset = students.objects.filter(college__department='CSE').values('name', department=F('college__department')) # 遍历结果示例 for item in queryset: print(f"学生姓名: {item['name']}, 部门: {item['department']}")
Django ORM会自动处理反向关联的内连接逻辑,college__department表示过滤关联的college表中department为CSE的记录,F表达式用来直接获取关联表的字段值。
方法3:使用原生SQL(适合习惯原生写法的场景)
如果还是想直接用你给出的SQL语句,Django也支持原生查询,记得用参数化写法避免SQL注入:
from django.db import connection with connection.cursor() as cursor: cursor.execute( "SELECT b.name, a.department FROM college as a INNER JOIN students as b ON (a.s_id = b.id) WHERE a.department = %s", ['CSE'] ) results = cursor.fetchall() # 遍历结果示例 for name, department in results: print(f"学生姓名: {name}, 部门: {department}")
内容的提问来源于stack exchange,提问作者msd
相关产品推荐
相关产品推荐

