Django ORM的“相关数据”加载行为
在LINQ中(我来自C#的背景),你可以通过Include("xxx")方法手动加载相关表的数据。
from a in ctx.MainTable.Include("SubTable")
select a;
在上面的代码中,MainTable的每一个实例都会被加载,同时MainTable.SubTable的所有数据也会被加载。如果不调用"Include",那么返回的每个MainTable的SubTable属性都会是空的。
在Django的ORM中有没有类似的方法?如果没有,Django在这种情况下的默认行为是什么呢?
1 个回答
4
看看这个:
http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4
你可以创建一个 select_related
查询集,这样可以跟踪关系并提前获取相关的数据行。
通常情况下,你不会太在意这个,直到你发现ORM(对象关系映射)自动获取的单个数据太慢了。
当你简单地提到一个相关对象的字段时:
x = MainTable.objects.get( id="some Object" )
y= x.subTable
ORM会懒懒地处理相关的子表数据行。
你不能轻易地把整个表的数据都加载到内存里。查询集是“懒惰”的,直到没有其他理由,它才会去获取数据行。想想这个。
for m in MainTable.objects.all():
y = m.subTable
if y.someAttribute > 5:
break
那么你可能并不需要 MainTable
中的所有对象。查询集已经准备好去获取它们,但实际上并不会一次性获取所有数据。这就是为什么我们通常只使用 x.subTable
,然后让ORM根据需要去获取数据行。
偶尔你会发现这样做太慢了。那时候你可以使用 MainTable.objects.select_related()...
来强制获取其他表中的数据行。