2010-11-08 29 views
12

我有問答&內置在Django有如下型號A型的網站:Django:使用Django ORM實現JOIN?

class Question(models.Model): 
    title = models.CharField(max_length=70) 
    details = models.TextField() 

class Answer(models.Model): 
    question_id = IntegerField() 
    details = models.TextField() 

我需要與它一起的答案顯示特定的問題。通常我需要2個查詢來做到這一點:

Question.objects.get(id=1) 
Answer.objects.get(question_id=1)[:10] 

我希望檢索一切使用一個查詢。在MySQL中它會是:

SELECT * 
FROM Question JOIN Answer ON Question.id=Answer.question_id 
WHERE Question.id=1 
LIMIT 10 

是否有反正我可以通過Django的ORM做到這一點? 在這種情況下extra()會有幫助嗎?

回答

26

這正是select_related()所做的。唯一的小問題,就是 你必須開始尋找答案的模式,而不是問題,但 結果是一樣的:

answers = Answer.objects.filter(question_id=1).select_related() 

現在每個答案對象有一個預取的「問題」屬性,和 訪問它不會再次擊中分貝。

+0

謝謝,如果我們需要在相關表上設置外鍵名稱,假設表A與B有關,B與C有關(所有表都只有「名稱」和「標識」)。我們想通過相關的C表對象連接到A所示的每一個條目。 – 2016-09-07 08:49:48

26

考慮使用models.ForeignKey(Question)而不是question_id = IntegerField()

1
class Question(models.Model): 
     title = models.CharField(max_length=70) 
     details = models.TextField() 

    class Answer(models.Model): 
     question = models.ForeignKey('Question') 
     details = models.TextField() 

    id = <whatever_id>  
    answers = Question.objects.get(id=id).answer_set.all()