我想弄清楚是否有办法在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多条记录,因此避免这种开销会很好。 (另外,对于亚当和德米特里:我很抱歉在响应中的延迟!)