Django ORM: SUM of grouped MAX



我正在尝试翻译这个SQL查询:

SELECT user_id, SUM(max_score) 
FROM (SELECT user_id, MAX(score) AS max_score
FROM submissions 
GROUP BY exercise_id, user_id) AS subquery 
GROUP BY user_id;

,其中表submissionsuser_idexercise_idscore列。

转换内部子查询结果为:

subquery = (
Submission.objects
.values("exercise", "user")
.annotate(max_score=Max("score"))
.values("user", "max_score")
)

的查询集如下:

<QuerySet [{'user': 1, 'max_score': 27}, 
{'user': 2, 'max_score': 50}, 
{'user': 1, 'max_score': 16}, 
{'user': 3, 'max_score': 14}, 
{'user': 1, 'max_score': 14}, 
...]>

然而,当我试图通过用户使用subquery.annotate(total_score=Sum("max_score"))来总结它时,我得到:

FieldError: Cannot compute Sum('max_score'): 'max_score'是一个聚合

我如何在Django ORM中实现这个,而不是像这样低效的解决方案:

scores = defaultdict(int)
for row in subquery:
scores[row['user']] += row['max_score']
result = subquery.aggregate(total_score=Sum("max_score"))

访问result中的值:

result['total_score']

annotate返回在方法参数中指定的每一行上具有特殊属性集的行,但它仍然返回行(QuerySet)。aggregate方法返回一个聚合值的结果。

让我知道它是否有效:)