6

有兴趣了解如何在 Django 等框架中实现延迟加载。何时决定执行联接?有没有办法在 Django 中强制加载?是否有时需要强制 Django 急切加载?

4

1 回答 1

12

一般的答案是,当您实际请求某些记录时,Django 会决定执行查询。最常见的是,这意味着遍历查询集 ( for record in queryset:) 或使用list()内置函数将查询集转换为列表。

有关官方文档中的更多详细信息,请参阅何时评估查询集。

它通过定义一个名为QuerySetin的类来实现这一点django/db/models/query.py,其中的特殊方法如__repr__,__getitem__并被__iter__编码为做正确的事情。

如果您需要强制预先加载,只需在查询集上运行内置 Python 列表函数,例如:

qs = SomeModel.objects.all()
ql = list(qs)

此调用list()将执行数据库查询并将所有对象加载到内存中。您需要这样做应该很少见,但一种情况是您需要在模板中的多个位置使用查询结果。转换为列表并在模板上下文中传递列表将只执行一次查询,而不是对您迭代的模板中的每个位置执行一次。

于 2009-07-06T05:35:59.610 回答