2011-04-18 130 views
4

我有三種模式,一個主題可以有零個或多個問題,一個問題可以有零個或多個答案。只有一個答案是正確的。Django查詢多對一關係

他們是多對一的關係。

class Topic(models.Model): 

class Question(models.Model): 
    topic = models.ForeignKey(Topic) 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    isright = models.BooleanField(verbose_name='Right') 

現在我試圖循環根據主題的問題,我怎樣才能實現它與模板?

<topic> 

    <question> 
    <answer> 
    <answer> 
    <answer> 
    <answer> 

    <question> 
    <answer> 
    <answer> 
    <answer> 
    <answer> 

如何爲問題添加分頁程序?

paginator = Paginator(topic.question_set.all(), 25) 

回答

5

如果我已經瞭解好了,你要循環利用 '主題' 命令答案:

answers = Answer.objects.order_by('question__topic', 'question') 

或:

for topic in Topic.objects.all(): 
    for question in topic.question_set.all(): 
     for answer in question.answer_set.all(): 
      ...do something... 

在模板中,你可以做同樣的,提供變量topics as Topic.objects.all():

{% for topic in topics %} 
    {% for question in topic.question_set.all %} 
     {% for answer in question.answer_set.all %} 
      ...do something... 
     {% endfor %} 
    {% endfor %} 
{% endfor %} 
+0

這將叉,但會執行這麼多的疑問,即DB服務器將開始思考後自殺第十要求。 – 2011-04-19 12:46:30

+0

:)第一個查詢應該更快。當然馬文db後端將不鼓勵... – Don 2011-04-19 12:56:00

+0

謝謝唐的答案。 – kelvinfix 2011-04-19 14:55:05

0
topic_instance.question_set.all() 

docs

+0

我已閱讀文檔。謝謝Vasil。 – kelvinfix 2011-04-19 14:55:37

1

使用* _set.all()變量:

t = Topic.objects.get(id=X) 
questions = t.question_set.all() 

for q in questions: 
    answers = q.answer_set.all() 

    for a in answers: 
      print a 
+0

如何在模板中執行此操作? – kelvinfix 2011-04-19 03:42:54