获得所有用户提交的总分Django

时间:2015-09-12 22:24:18

标签: python django

我有两个简单的模型:

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;如何构建查询和旋转我的车轮,所以我想我会联系社区。

  

注意:我并非只是希望每个用户都能使用这些用户。和他们的总数&#39;作为回应,我想要整个用户对象以及&#39; total&#39;的新属性。所以我拥有所有用户的数据以及他们所有提交的总分数。

更新 我应该注意到我已经尝试过:

User

但是当我想要3个结果(每个唯一用户一个)以及他们的总积分(对于用户提交的所有内容)时,这仍然给我相同的6个结果。

解: 感谢Christian指出我正确的方向,这是我的最后一个问题:

Submission.objects.all().annotate(total=Sum('task__points'))
  

注意:上述查询会获得所有提交的用户(并非所有用户都有提交的内容)获得批准,并为每个提交的任务总计积分,并将其排在最高到最低的位置。

1 个答案:

答案 0 :(得分:1)

你想要Django的annotate feature。尝试这样的事情:

from django.db.models import Sum
User.objects.all().annotate(total=Sum('submission__task__points'))