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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:09