2012-02-25 8 views
2

私は2つのモデルがあります。それらの質問と回答を呼び出す:問合せモデルとすべてのForeignKeyの関連付けに対するn + 1問合せの回避

class FacetQuestion(models.Model): 
    the_question = models.CharField(max_length=50) 

class FacetAnswer(models.Model): 
    question  = models.ForeignKey(FacetQuestion) 
    display_order = models.SmallIntegerField() 
    the_answer  = models.CharField(max_length=1024) 

私が選んだあたりに命じた質問と回答で、1つのリスト内のすべての質問と回答を提示したいと思います:

Q1 
    A1 
    A2 
    A3 
Q2 
    A10 
    A9 
    A4 

n + 1個のデータベースクエリを作成したり、愚かなテンプレートを作成することはありません。

select title_short,answer_note from coat_facetquestion 
join coat_facetanswer on (coat_facetanswer.question_id=coat_facetquestion.id) 
order by coat_facetquestion.id,coat_facetanswer.display_order; 

はジャンゴでの最善の方法は何だし、どのようなテンプレートは次のようになります?私のようなデータベースの男のために簡単に参加だが、トトは、我々はもはやSQLの土地ではないよ、私たちに通知し

<ul> 
    {% for q in questions %} 
    <li>{{ q.the_question }}</li> 
     {% for a in q.FacetAnswers_set.all %} 
      <li>{{ q.the_answer }}</li> 
     {% endfor %} 
    {% endfor %} 
</ul> 

私は古いトラックのビットがdjango-batch-selectです。 select_related()もありますが、答えが必要なようですが、そうであれば、ドキュメントはそれほど明確ではありません。

答えて

0

:階層データを扱うために、最高のは、単純にクエリselect_related(の数を減らすためにhttp://django-mptt.github.com/django-mptt/

のようです)は大きな助けです。

階層的な結果を表示するために、まだそれほど多くは見つかりませんでした。

0

私は質問の1つの部分にしか答えることができません。

select_related()は、おそらくあなたが探しているものではありません。 1:n関係の「1面」を選択します。これにより、すべての回答を選択し、それぞれの回答について関連する質問を一度に取り出すことができます。

ただし、このように関連するエンティティのプロパティを使用してクエリをフィルタリングすることができます。

FacetAnswer.objects.filter(question__property = 'some_value').select_related() 

はまだ、あなたのクエリセットはアンサーモデルに基づいて行われますので、あなただけのfor a in answersを繰り返すことができます。

1

あなたはsetdefault()を見てもFacetQuestion.objects.select_related('facetanswer_set').all()

を使用することができます。これはPythonコマンドで、ネストされたdict構造を構築することができます。すべての質問とすべての回答を照会し、Pythonで必要な構造を構築します。

+0

select_related()は、それが完全な解決策ではないと考えています。ありがとう。 – Bryce

関連する問題