如何用Django ORM计算所有用户最高考试成绩的平均分
解决方法:计算用户最高考试成绩的平均分
针对你的需求——取每个用户的最高考试成绩后计算平均分,用Django ORM可以很简洁地实现,下面是具体步骤和代码:
核心思路
我们需要两步操作:
- 按用户分组,获取每个用户的最高
total_score - 对这些最高分计算平均值
代码实现
方法一(推荐,简洁高效)
直接通过values()分组+annotate()聚合每个用户的最高分,再用aggregate()计算平均分:
from django.db.models import Max, Avg # 第一步:按用户分组,得到每个用户的最高成绩 user_top_scores = FinishedExam.objects.values('user').annotate(max_score=Max('total_score')) # 第二步:计算所有用户最高分的平均值 average_score = user_top_scores.aggregate(average=Avg('max_score'))['average']
用你提供的示例数据测试,这段代码会先得到[{"user":1, "max_score":10}, {"user":2, "max_score":3}, {"user":3, "max_score":8}],然后计算(10+3+8)/3 = 7,完全符合预期结果。
方法二(子查询方式)
如果需要更灵活的场景(比如后续要关联其他模型字段),可以用子查询实现:
from django.db.models import Subquery, OuterRef # 子查询:获取当前用户的最高成绩 max_score_sub = FinishedExam.objects.filter(user=OuterRef('user')).values('user').annotate(max=Max('total_score')).values('max') # 标注每个用户的最高成绩,去重后计算平均 average_score = FinishedExam.objects.annotate(user_max=Subquery(max_score_sub)).values('user_max').distinct().aggregate(average=Avg('user_max'))['average']
注意事项
- 如果某个用户没有完成任何考试,该用户不会被纳入计算范围,符合业务逻辑
- 你的
FinishedExam模型中total_score默认值为0,所以即使有用户考试得0分,也会正常参与计算
内容的提问来源于stack exchange,提问作者chin8628
相关产品推荐
相关产品推荐

