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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:06:00