2010-11-08 28 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()