有兴趣知道在Django这样的框架中如何实现延迟加载。什么时候决定进行加入?有没有办法迫使Django急切加载?是否有时候需要强制Django加载?
答案 0 :(得分:11)
一般的答案是Django决定在你实际要求记录时执行查询。最常见的是,这意味着迭代查询集(for record in queryset:
)或使用list()
内置函数将查询集转换为列表。
有关官方文档中的更多详细信息,请参阅When QuerySets are evaluated。
它通过在QuerySet
中定义一个名为django/db/models/query.py
的类来完成此任务,其中__repr__
,__getitem__
和__iter__
等特殊方法被编码为是对的。
如果你需要强制加载,只需在查询集上运行内置的Python列表函数,如:
qs = SomeModel.objects.all()
ql = list(qs)
对list()
的此调用将执行数据库查询并将所有对象加载到内存中。您需要这样做很少见,但有一种情况是您需要在模板中的多个位置使用查询结果。转换为列表并在模板上下文中传递列表将仅对您迭代的模板中的每个位置执行一次查询而不是一次。