在LINQ中(我是C#出身),可以通过Include("xxx")方法手动加载相关表的数据
from a in ctx.MainTable.Include("SubTable")
select a;
在上面的代码中,加载了 MainTable 的每个实例,并且还加载了 MainTable.SubTable 的所有数据。如果不调用“Include”,则每个返回的 MainTable 的 SubTable 属性都将返回 null。
Django ORM 是否有等效的方法?如果不是,对于上述情况,Django 的默认行为是什么?
请您参考如下方法:
看这个:
http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4
您创建一个select_related 查询集来跟踪关系并预取相关行。
通常,您不会浪费太多时间这样做,直到您知道 ORM 自动完成的单个提取太慢。
当您简单地命名一个相关的对象字段时:
x = MainTable.objects.get( id="some Object" )
y= x.subTable
ORM 将执行相关子表行的操作。懒洋洋地。
您无法轻松地将整个表格提取到内存中。 QuerySet 是“惰性的”,除非没有可能的借口,否则不会获取行。考虑一下。
for m in MainTable.objects.all():
y = m.subTable
if y.someAttribute > 5:
break
那么您实际上可能不需要 MainTable 中的所有对象。查询集已准备好获取它们。它实际上并没有全部获取它们。这就是为什么我们通常只做 x.subTable 并将其留给 ORM 根据需要获取行。
偶尔你可以证明它太慢了。然后您可以执行 MainTable.objects.select_related()... 并强制导航到其他表中的行。
