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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:05:39