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

如何将统计各年级停学人数的SQL查询转换为Django ORM实现

前提说明

你需要先确保Django项目中定义了和两张表对应的ORM模型,示例定义如下:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=100)
    school_grade = models.IntegerField()

    class Meta:
        db_table = 'students' # 若你的表名和Django默认生成规则不一致,需要手动指定实际表名

class Suspension(models.Model):
    reason = models.TextField()
    # 外键关联Student表,db_column指定对应数据库表的字段名
    student = models.ForeignKey(Student, on_delete=models.CASCADE, db_column='student_id')

    class Meta:
        db_table = 'suspensions'

对应查询实现

使用Django ORM的values+annotate+Count组合即可实现和你给出的原生SQL完全等价的统计效果,代码如下:

from django.db.models import Count

# 统计结果
suspension_count_by_grade = Student.objects.filter(
    # 过滤出有停学记录的学生
    suspension__isnull=False
).values(
    # 指定按school_grade分组
    'school_grade'
).annotate(
    # 统计每个分组的数量,别名对应你要的统计字段名
    number_of_suspension=Count('school_grade')
)

结果示例

执行后返回的QuerySet结构如下,和你预期的结果完全匹配:

<QuerySet [{'school_grade': 1, 'number_of_suspension': 2}, {'school_grade': 3, 'number_of_suspension': 1}]>

你可以直接遍历这个QuerySet获取每个年级对应的停学人数,也可以根据需求对结果做进一步排序、过滤等操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:06:03