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