我正在制作一个非常基本的民意调查应用。它与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>
答案 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 %}