如何将统计各年级停学人数的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
相关产品推荐
相关产品推荐

