【问题标题】:Django 1.6 how to correctly annotate Count() and Sum() at the same time?Django 1.6 如何同时正确注释 Count() 和 Sum()?
【发布时间】:2014-03-05 13:37:13
【问题描述】:

简单说明:

#for each q in Question , q.votes is correct
Question.objects.annotate(votes=Sum('vote__value')) 
#add a Count annotate, q.answers is correct, while q.votes not.
Question.objects.annotate(votes=Sum('vote__value', distinct=True),answers=Count('answer', distinct=True),)

如果我想同时注释 Count() 和 Sum(),怎么做?因此我可以这样做:

qs = Question.objects.annotate(votes=Sum('vote__value', distinct=True),answers=Count('answer', distinct=True),)
for q in qs:
    #do something with q.votes and q.answers in a template
    #this will be convenient.

Click Here如果需要,可以下载测试项目代码。测试函数在raw.tests.test()中

【问题讨论】:

  • 您将如何为此编写单个 SQL 查询?
  • @anuragal 我不熟悉 SQL..你能举个例子吗?
  • distinct=True 应该从 Sum 注释中删除。 QuerySet 实际上应该可以与两个注释一起正常工作。

标签: django


【解决方案1】:

在 Django 1.11 中,您可以使用 Subquery()

votes = Vote.objects.filter(question=OuterRef('pk').order_by().values('question')
sum_votes = votes.annotate(s=Sum('value')).values('s')

answers = Answer.objects.filter(question=OuterRef('pk').order_by().values('question')
count_answers = answers.annotate(c=Count('*')).values('c')

qs = Question.objects.annotate(votes=Subquery(sum_votes),
                               answers=Subquery(count_answers))

【讨论】:

    【解决方案2】:

    感谢阿努加。他提醒我。我想到了额外的:

    qs3 = Question.objects.extra(
        select={
        'answers': 'SELECT COUNT(*) FROM raw_answer WHERE raw_answer.question_id = raw_question.id',
        'votes':'SELECT SUM(value) FROM raw_vote WHERE raw_vote.question_id = raw_question.id',
        },
    

    这会好的。

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 1970-01-01
      • 2021-10-23
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2018-12-16
      相关资源
      最近更新 更多