Django如何处理类似于filter语句的JOIN?

时间:2019-12-20 13:23:53

标签: django django-models

我有一些由3种模型组成的代码,分别是Course,Section和Lecture。 一个课程有很多部分,一个章节有很多讲座。假设我要检索属于特定课程的所有讲座,课程还具有一个名为“ title”的属性,因此可以用于过滤。根据我正在阅读的教程,我应该这样做来获得讲座:

Lecture.objects.filter(section__course__title = "title of course)

这非常简单,但是我想知道django是如何在后台进行处理的。我可以想象,必须涉及到一些联接,但是根据该线程Does Django support JOIN?的回答,Django无法进行联接。 但是,当我查看他提供的链接时,我可以看到django确实在后台处理联接。

因此,假设django处理连接,它如何知道何时进行左连接或常规连接?只有在确定每个父模型都有对子模型的引用且该字段标记为非null时,才能进行常规联接。如果可以为null,则应使用左连接。 django是否足够聪明,可以知道何时建立哪个联接?

谢谢

1 个答案:

答案 0 :(得分:1)

django ORM将在您抽象出很多复杂性的背景下为您执行联接操作。

如果您运行以下代码,则应该能够看到django生成的SQL。

quseryset = Lecture.objects.filter(section__course__title = "title of course")
print(queryset.query)

在django文档中对此进行了解释:Lookups that span relationships