2014-04-07 54 views
2

我是Django的新手,我創建了一個測驗應用程序。我想知道是否有可能只做一個查詢,並獲得三個相關表的多級查詢集。有關對象的Django多維查詢集

一個測驗有多個問題,一個問題有多個選擇。

測驗/ models.py:

class Quiz(models.Model): 
    title = models.CharField(max_length=200) 

class Question(models.Model): 
    quiz_id = models.ForeignKey("Quiz", db_column="quiz_id") 
    question = models.TextField() 

class Choice(models.Model): 
    question_id = models.ForeignKey("Question", db_column="question_id") 
    text = models.TextField() 

我期待的結果是這樣的:

[{ 
quiz_id:1, 
quiz_title: "Quiz Title", 
quiz_questions: 
[ 
    { 
     question_id:1, 
     question_question:"The Question", 
     question_choices:[ 
      { 
       choice_id:1, 
       choice_text:"The Choice Text" 
      }, 
      { 
       choice_id:2, 
       choice_text:"The Choice Text" 
      }] 
    }, 
    { 
     question_id:2, 
     question_question:"The Question", 
     question_choices:[ 
      { 
       choice_id:1, 
       choice_text:"The Choice Text" 
      }, 
      { 
       choice_id:2, 
       choice_text:"The Choice Text" 
      }] 
    } 
] 
}] 

是否有可能只用一個單一的查詢來獲得這種結果? 到目前爲止,我可以得到一個單一的測驗對象,並通過執行獲得所有相關的問題:

quiz_object.questions_set.all() 

但是,我不能去選擇研究水平和結果存儲在不同的變量。

+0

這會有幫助嗎? Question.objects.filter(quiz = quiz_object)'''''''''''''''''''''''''''''''''''''''''''''''''' –

回答

1

您不能在一個查詢中完成所有操作,但可以使用prefetch_related()來最小化查詢數。在你的情況可能是這樣的,而且可能會導致一共有三個數據庫查詢:

Quiz.objects.filter(stuff=whatever).prefetch_related('question__choice') 

the documentation比較這個例子:

Restaurant.objects.prefetch_related('pizzas__toppings') 

這將預取所有比薩屬於餐館,以及屬於這些比薩餅的所有配料。這將導致總共3個數據庫查詢 - 一個用於餐館,一個用於比薩餅,另一個用於澆頭。

+0

完美!這就是我要找的! Deym! Django使生活更輕鬆。多年前應該做出這個轉變。謝謝凱文! – cranktrooper