Django中如何统计指定年级关联的学生模型对象数量
Django 单年级学生人数统计实现方案
先修复现有模型的已知错误
你的现有模型代码存在两处会影响运行的问题,先修正再做后续开发:
- Student模型的grade外键关联类名拼写错误,应该为大写开头的
Grade,修改为:grade = models.ForeignKey('Grade', on_delete=models.CASCADE ) - Grade模型的
__str__方法返回值错误,类中不存在grade字段,应该返回年级名称字段,修改为:def __str__(self): return str(self.grade_name)
统计人数的三种实现方式
方式1:视图中直接查询(适合单页面临时查询)
from .models import Grade, Student # 方法A:通过年级实例反向查询 target_grade = Grade.objects.get(grade_name=5) # 示例查询5年级 student_count = target_grade.student_set.count() # 方法B:直接过滤学生表查询 student_count = Student.objects.filter(grade__grade_name=5).count()
查询到的student_count可以直接通过context传入模板渲染展示。
方式2:给Grade模型新增自定义方法(适合多处复用)
在Grade模型中新增统计方法,后续任意位置拿到年级实例都可以直接调用获取人数:
class Grade(models.Model): # 原有字段保持不变 def get_student_count(self): return self.student_set.count()
调用方式:grade_instance.get_student_count(),模板中可以直接写{{ grade.get_student_count }}展示。
方式3:批量标注人数(适合同时查询多个年级人数,性能最优)
用Django的annotate一次性查询所有年级的人数,避免N+1查询问题:
from django.db.models import Count # 查询返回的所有年级实例都会自带student_count属性 grade_list = Grade.objects.annotate(student_count=Count('student')) # 取值示例 for grade in grade_list: print(f"{grade.grade_name}年级人数:{grade.student_count}")
模板展示示例
把统计结果传入模板后,直接渲染即可:
<div class="stat-card"> <h3>{{ grade.grade_name }}年级总人数</h3> <span class="count-num">{{ student_count }}</span> </div>
内容的提问来源于stack exchange,提问作者Mohammed Shahariar Jawad
相关产品推荐
相关产品推荐

