0

我正在制作一个非常基本的投票应用程序。它与 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 个实际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>
4

2 回答 2

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 官方文档

于 2012-06-11T00:08:44.940 回答
0

没关系,在找到一个使用与我相同类型的模型的教程后自己修复它。

基本上修复是在视图中:

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 %}
于 2012-06-11T20:36:18.010 回答