【问题标题】:Django: using aggregates to show vote counts for basic polls appDjango:使用聚合显示基本民意调查应用程序的投票计数
【发布时间】:2012-06-10 22:47:41
【问题描述】:

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

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 个实际 PollAnswers 之一的投票)。如果我查看 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>

【问题讨论】:

    标签: django django-aggregation


    【解决方案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

    【讨论】:

    • 这些都不起作用:第一个具有相同的效果(每次投票只有一行),第二个不返回任何内容。
    • 如果有帮助,我已将我的模板代码添加到问题中,以防我在那里做错了什么。
    • 第二个带值的应该返回正确的值,尽管它不是查询集而是值查询集。
    • 在您的模板代码中,您有 {{ votes.num_votes }},您想要 PollAnswer 或 PollQuestion 的所有投票吗?我的第二个示例应该返回每个 PollAnswer 的投票。
    【解决方案2】:

    没关系,找到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 %}
    

    【讨论】:

    • 啊,虽然这不是正确的解决方法——它会查询每个PollAnswer 字段(例如SELECT * FROM poll_votes WHERE poll_votes.answer_id = 100)。有人有什么想法吗?
    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 2020-01-20
    • 2018-08-25
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多