我想弄清楚是否有辦法在Django中使用它的ORM做一個有點複雜的聚合,或者如果我將不得不使用extra()來堅持一些原始SQL。Django中的列彙總
這裏是我的對象模型(剝離只顯示要領):
class Submission(Models.model)
favorite_of = models.ManyToManyField(User, related_name="favorite_submissions")
class Response(Models.model)
submission = models.ForeignKey(Submission)
voted_up_by = models.ManyToManyField(User, related_name="voted_up_responses")
我想要做的就是和所有給定提交的投票:那就是,所有的選票對於任何其答覆,然後還包括將提交作爲最愛的人數。
我有第一部分工作使用下面的代碼;這將返回的總票數爲每個提交的所有答覆:
submission_list = Response.objects\
.values('submission')\
.annotate(votes=Count('voted_up_by'))\
.filter(votes__gt=0)\
.order_by('-votes')[:TOP_NUM]
(因此獲得了投票總,我按降序排序,並返回頂端TOP_NUM意見後,獲得「最佳的」上市)
該部分起作用。您有什麼方法可以建議在投票中包含每個提交的受衆人數? (我寧願避免額外()的便攜性,但我認爲這可能是必要的,我願意使用它)。
編輯:我意識到閱讀後,我應該有在我對這個問題的描述中更加清楚。理想的解決方案是讓我按總票數排序(總數爲voted_up_by
和favorited
),然後挑選數據庫中的前幾名。如果這是不可能的,那麼我願意加載每個響應的一些字段並在Python中進行處理;但由於我將處理100,000多條記錄,因此避免這種開銷會很好。 (另外,對於亞當和德米特里:我很抱歉在響應中的延遲!)