我有一些由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是否足够聪明,可以知道何时建立哪个联接?
谢谢
答案 0 :(得分:1)
django ORM将在您抽象出很多复杂性的背景下为您执行联接操作。
如果您运行以下代码,则应该能够看到django生成的SQL。
quseryset = Lecture.objects.filter(section__course__title = "title of course")
print(queryset.query)
在django文档中对此进行了解释:Lookups that span relationships