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'))

このクエリの結果を出力すると、投票ごとに1つの行が表示されます(たとえば、投票に対して約40の「回答」が表示され、それぞれが5つの実際PollAnswerの投票の1つに対する投票を表します)。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 に答える