Django:使用聚合来显示基本民意调查应用的投票计数

时间:2012-06-10 22:47:41

标签: django django-aggregation

我正在制作一个非常基本的民意调查应用。它与Django教程中的类似,但我选择将计票方面分解为自己的模型(该教程只是在每个vote旁边添加answer计数字段。这是我的模特:

class PollQuestion(models.Model):
    question = models.CharField(max_length=75)

class PollAnswer(models.Model):
    poll = models.ForeignKey('PollQuestion')
    answer = models.CharField(max_length=75)

class PollVote(models.Model):
    poll = models.ForeignKey('PollQuestion')
    answer = models.ForeignKey('PollAnswer')
    date_voted = models.DateTimeField(auto_now_add=True)
    user_ip = models.CharField(max_length=75)

我试图显示给定民意调查的所有投票数。这是我的观看代码:

from django.db.models import Count
poll_votes = PollVote.objects.select_related('PollAnswer').filter(poll=poll_id).annotate(num_votes=Count('answer__id'))

当我输出此查询的结果时,我每次投票只获得一行(例如,我看到我的民意调查中有大约40个'答案',每个代表对5个实际PollAnswer中的一个进行投票。如果我查看Django提出的查询,它会在民意调查中为每次投票运行类似的内容:

SELECT `poll_answers`.`id`, `poll_answers`.`poll_id`, `poll_answers`.`answer` 
FROM `poll_answers` 
WHERE `poll_answers`.`id` = 101

任何人都可以在这里向我推进正确的方向吗?我觉得这应该很容易。

编辑:这是我的模板代码,为了完整性。

<ul>
    {% for vote in votes %}
        {{ vote.answer }} ({{ votes.num_votes }})<br />
    {% endfor %}
</ul>

2 个答案:

答案 0 :(得分:1)

尝试:

 poll_votes = PollVote.objects.filter(poll=poll_id).annotate(num_votes=Count('answer__id'))

或:

poll_votes = PollVote.objects.values('poll', 'answer__answer').filter(poll=poll_id).annotate(num_votes=Count('answer__id'))

相关文档: Django offical docs

答案 1 :(得分:0)

没关系,在找到tutorial which uses the same sort of models as me之后自己修复。

基本上修复在视图中:

p = get_object_or_404(PollQuestion, pk=poll_id)
choices = p.pollanswer_set.all()

在模板中:

{% for choice in choices %}
    <p class="resultsList">{{choice.answer}} - {{choice.pollvote_set.count}}</p>
{% endfor %}