有兴趣了解如何在 Django 等框架中实现延迟加载。何时决定执行联接?有没有办法在 Django 中强制加载?是否有时需要强制 Django 急切加载?
问问题
4387 次
1 回答
12
一般的答案是,当您实际请求某些记录时,Django 会决定执行查询。最常见的是,这意味着遍历查询集 ( for record in queryset:
) 或使用list()
内置函数将查询集转换为列表。
有关官方文档中的更多详细信息,请参阅何时评估查询集。
它通过定义一个名为QuerySet
in的类来实现这一点django/db/models/query.py
,其中的特殊方法如__repr__
,__getitem__
并被__iter__
编码为做正确的事情。
如果您需要强制预先加载,只需在查询集上运行内置 Python 列表函数,例如:
qs = SomeModel.objects.all()
ql = list(qs)
此调用list()
将执行数据库查询并将所有对象加载到内存中。您需要这样做应该很少见,但一种情况是您需要在模板中的多个位置使用查询结果。转换为列表并在模板上下文中传递列表将只执行一次查询,而不是对您迭代的模板中的每个位置执行一次。
于 2009-07-06T05:35:59.610 回答