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

如何将课程题目关联统计SQL转换为Django ORM语句

Django ORM实现:统计各课程关联题目总数

需求说明

需要在表格中展示两类数据:

  • 课程名称
  • 对应课程下的题目总数量

待转换的原生SQL语句如下:

SELECT DISTINCT exam_course.course_name,
                COUNT(exam_question.question)
FROM exam_course
INNER JOIN exam_question ON exam_question.course_id = exam_course.id
GROUP BY exam_question.course_id

对应ORM实现

先确认模型关联关系:ExamQuestion(题目表)中存在指向ExamCourse(课程表)的外键字段course,和SQL里的关联条件exam_question.course_id = exam_course.id对应。

实现代码:

from django.db.models import Count

# 查询结果为包含课程名、对应题目数的字典列表,可直接传入模板渲染表格
course_question_count = ExamCourse.objects.annotate(
    # 注意:如果外键设置了related_name,将examquestion替换为你设置的related_name值
    question_total=Count('examquestion')
).filter(
    # 对应INNER JOIN逻辑,过滤掉无关联题目的课程
    question_total__gt=0
).values('course_name', 'question_total')

补充说明

  • annotate配合Count实现按课程维度分组统计关联题目数量,和SQL中GROUP BY+COUNT的逻辑完全对应
  • filter(question_total__gt=0)实现内连接效果,仅返回存在关联题目的课程,和原生SQL返回范围一致
  • values指定最终返回的字段,和SQL中SELECT后指定的字段对应
  • 如果需要校验生成的SQL是否符合预期,可执行print(course_question_count.query)打印最终生成的SQL语句核对

如果你在ExamQuestion的外键字段中自定义了related_name参数,例如course = models.ForeignKey(ExamCourse, on_delete=models.CASCADE, related_name="question_list"),只需要把Count内的参数替换为自定义的related_name值即可,即写为Count('question_list')。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:19:51