我有两个简单的模型:
class Task(TimeStampedModel):
...
title = models.CharField(max_length=255)
description = models.CharField(max_length=255)
points = models.PositiveIntegerField()
class Submission(TimeStampedModel):
user = models.ForeignKey(User, related_name='submissions')
task = models.ForeignKey(Task, related_name='task_submissions')
...
我正在努力弄清楚,我认为应该是一个简单的查询,使用Django的ORM。
我们说我总共有6个Submissions
乘3个唯一Users
:
[<Submission: John Doe>, <Submission: Ricky Bobby, <Submission: Ricky Bobby>, <Submission: John Doe>, <Submission: Jane Smith>, <Submission: Jane Smith>]
现在,我真正想要的是查询每个用户的所有Submissions
和总计Task
点,但只想要每个唯一{{1}的一个并为每个User
添加一个名为total
的(我认为应该是注释的)属性。
所以我真正得到的是:
User
每个[<Submission: John Doe>, <Submission: Ricky Bobby, <Submission: Jane Smith>]
现在都有一个名为Submission
的额外属性,该属性是所有用户total
Submission
点的总和。因此,如果Task
有2个提交,任务点为5和5,那么总数将为10。
我正在尝试各种各样的事情而不是&#34;得到&#34;如何构建查询和旋转我的车轮,所以我想我会联系社区。 p>
注意:我并非只是希望每个用户都能使用这些用户。和他们的总数&#39;作为回应,我想要整个用户对象以及&#39; total&#39;的新属性。所以我拥有所有用户的数据以及他们所有提交的总分数。
更新 我应该注意到我已经尝试过:
User
但是当我想要3个结果(每个唯一用户一个)以及他们的总积分(对于用户提交的所有内容)时,这仍然给我相同的6个结果。
解: 感谢Christian指出我正确的方向,这是我的最后一个问题:
Submission.objects.all().annotate(total=Sum('task__points'))
注意:上述查询会获得所有提交的用户(并非所有用户都有提交的内容)获得批准,并为每个提交的任务总计积分,并将其排在最高到最低的位置。
答案 0 :(得分:1)
你想要Django的annotate
feature。尝试这样的事情:
from django.db.models import Sum
User.objects.all().annotate(total=Sum('submission__task__points'))