[英]Getting total points for all of User's Submissions 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進行的簡單查詢。
假設我有3個唯一的Users
Submissions
了6份Submissions
:
[<Submission: John Doe>, <Submission: Ricky Bobby, <Submission: Ricky Bobby>, <Submission: John Doe>, <Submission: Jane Smith>, <Submission: Jane Smith>]
現在,我真正想要的是查詢所有Submissions
和總了Task
為每個用戶分,但只希望每個唯一的一個 User
,並添加一個(我想應該是一個注釋)呼吁物業total
給每個User
。
所以我真正得到的是:
[<Submission: John Doe>, <Submission: Ricky Bobby, <Submission: Jane Smith>]
現在,每個Submission
將具有一個稱為total
的額外屬性,該屬性是該用戶的所有Submission
Task
點的總和。 因此,如果User
有2個任務點分別為5和5的提交,則總數為10。
我正在嘗試各種方法,但不是在“搞定”如何構造查詢和旋轉輪子的過程,所以我認為自己可以接觸到社區。
注意:我不只是希望每個“用戶”及其“總數”作為響應,而是希望整個用戶對象以及新屬性“總數”,這樣我就可以獲得所有用戶數據以及他們的總積分他們所有的意見書。
更新:我應該注意我已經嘗試過:
Submission.objects.all().annotate(total=Sum('task__points'))
但是,當我想要3個結果(每個唯一用戶一個)和它們的總分(所有用戶提交的內容)時,這仍然給我同樣的6個結果。
解決方案:感謝Christian向我指出了正確的方向,這是我的最終查詢:
leaders = User.objects.filter(~Q(submissions=None)) \
.filter(submissions__status='approved') \
.annotate(total=Sum('submissions__task__points')) \
.order_by('-total')
注意:上面的查詢將獲取所有已批准提交的用戶(因為並非所有用戶都具有提交),並匯總每個已提交任務的分數,並按從高到低的順序排序。
您需要Django的annotate
功能 。 嘗試這樣的事情:
from django.db.models import Sum
User.objects.all().annotate(total=Sum('submission__task__points'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.