Skip to main content
 首页 » 编程设计

python之Django ORM 的 "related data"加载行为

2024年08月12日46yyy_WW

在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()... 并强制导航到其他表中的行。