Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.6如何同时正确注释Count()和Sum()?_Django - Fatal编程技术网

Django 1.6如何同时正确注释Count()和Sum()?

Django 1.6如何同时正确注释Count()和Sum()?,django,Django,简单描述: #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('a

简单描述:

#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.

如果需要,下载测试项目代码。测试函数位于raw.tests.test()中。

感谢您的支持。他提醒我。我想到了额外的:

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',
    },

这样就可以了

对于Django 1.11,您可以使用


你将如何为它编写一个SQL查询?@anuragal我不熟悉SQL。你能举个例子吗?
distinct=True
应该从
Sum
注释中删除。QuerySet实际上可以很好地处理这两个注释。
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))