0

私は次のモデルを持っています:

class Question(models.Model):
    question = models.CharField(max_length=100)
    detail = models.TextField(null=True, blank=True)

class PossibleAnswers(models.Model):
    question = models.ForeignKey(Question)
    value = models.CharField(max_length=200)

class Answer(models.Model):
    question = models.ForeignKey(Question)
    value = models.CharField(max_length=200)

それぞれQuestionPossibleAnswersユーザーによって定義されています。例: 質問 - 最高の果物は何ですか? 考えられる答え - リンゴ、オレンジ、ブドウ。これで、他のユーザーはAnswer、回答が に制限された質問をすることができPossibleAnswersます。

私が抱えている問題は、それぞれの数を取得することですAnswer。アップル vs オレンジ vs グレープを選択した回答者は何人ですか?

Question.answer_set.filter(value="Grapes").count()はすべてのブドウの回答の数を返しますが、フィルター条件 (この場合はブドウ) がわからない場合はどうなるでしょうか? ユーザーが回答オプションを定義し、さまざまなオプションがいくつあるかを定義するので、各回答オプションの応答数をどのように取得しますか?

4

3 に答える 3

2

まず、モデルを変更します。スキーマが正規化されていません。つまり、同じ情報 (回答のテキスト) を複数の場所に保持することになります。それ自体は悪いことだと考えられていますが、適切なクエリを設計することも非常に難しくなっています。それがあなたのモデルが次のように見えるべきだと私が思う方法です:

class Question(models.Model):
    question = models.CharField(max_length=100)
    detail = models.TextField(null=True, blank=True)

class PossibleAnswer(models.Model):
    question = models.ForeignKey(Question)
    value = models.CharField(max_length=200)

class Answer(models.Model):
    possible_answer = models.ForeignKey(PossibleAnswers)

ユーザーが可能な回答に投票するたびに、Answerその可能な回答を参照する新しいモデルを追加します。Answerユーザー投票を参照する外部キーなど、追加のフィールドをモデルに追加することもできます。

次に、次のコードを使用して、質問の情報 (考えられるすべての回答に対して実際の回答がいくつあるか) を取得しますfoo

PossibleAnswer.objects.filter(question=foo).annotate(Count('answer'))
于 2013-10-09T19:18:05.733 に答える
0

これは役に立ちますか?

q = Question.objects.get(pk=1)
[{v: q.answer_set.filter(value=v).count()} 
           for v in [pa.value for 
                       pa in q.possibleanswers_set.all()]]

Question オブジェクト q に対して存在する可能な回答ごとに {'possible_answer': 'count'} の辞書を返します。

ただし、大規模に使用する場合 (すべてのQuestion オブジェクトなど)、これは最も効率的な方法とは言えません。

于 2013-10-09T18:18:55.900 に答える
0

集計クエリが必要です:

from django.db.models import Count
Question.objects.annotate(Count('answer'))
于 2013-10-09T18:30:11.120 に答える