Django如何获取外键字段值并实现count等聚合统计操作
实现方法
Django ORM 支持通过双下划线 __ 跨外键关联查询字段,你可以通过两种方式完成统计:
首先修正两处代码笔误:
- Student 模型的 gender 外键关联的是 Gender 类,需要将参数里小写的
gender改为大写Gender,否则会触发引用错误 - views 中查询调用的是 Student 模型类,首字母需要大写,不能用小写的
student
方案1:从 Student 表统计(仅返回有学生关联的性别)
from django.db.models import Count def viewlist(request): gender_count = Student.objects.values('gender__title').annotate(total=Count('gender')).order_by('-total') # 遍历输出示例 for item in gender_count: print(f"{item['gender__title'] if item['gender__title'] else '未填写'} {item['total']}")
查询返回的每个字典包含gender__title(性别名称)和total(对应人数)两个字段,直接取值即可渲染要求的展示格式,未填写性别的学生对应gender__title为None,可自定义展示名称。
方案2:从 Gender 表统计(包含无学生关联的性别,人数显示为0)
如果需要展示后台添加的所有性别选项,哪怕对应人数为0,可以从Gender侧反向统计:
from django.db.models import Count def viewlist(request): gender_count = Gender.objects.annotate(total=Count('student')).order_by('-total') # 遍历输出示例 for gender in gender_count: print(f"{gender.title} {gender.total}")
查询返回的是Gender实例列表,每个实例自带title属性和统计得到的total属性,使用更直观。
内容的提问来源于stack exchange,提问作者Darwin
相关产品推荐
相关产品推荐

