【发布时间】:2011-06-30 20:11:05
【问题描述】:
我最近遇到了一些奇怪的行为,需要检查我的理解。
我在模型中使用了一个简单的过滤器,然后对结果进行迭代。
例如
allbooks = Book.objects.filter(author='A.A. Milne')
for book in allbooks:
do_something(book)
奇怪的是,它只返回了部分书籍列表。
但是,当使用相同的代码并使用 iterator() 时,这似乎工作得很好。
即
for book in allbooks.iterator():
do_something(book)
知道为什么吗?
附言我确实浏览了 Django 文档,但看不到查询集将如何被缓存在其他任何地方......
iterator()评估 QuerySet(通过执行查询)并返回结果的迭代器。 QuerySet 通常会在内部缓存其结果,以便重复评估不会导致额外的查询;iterator()将直接读取结果,而不在 QuerySet 级别进行任何缓存。对于返回大量对象的 QuerySet,这通常会带来更好的性能和显着减少的内存请注意,在已评估的 QuerySet 上使用
iterator()将强制它再次评估,重复查询。
【问题讨论】:
-
我刚刚注意到的另一件奇怪的事情。不使用 iterator() 时 - 它只返回 100 个对象。这似乎与前 100 个对象由 'iter' 自动缓存的事实相匹配,但我仍然想知道为什么循环只是在那里结束并且不继续迭代与过滤器匹配的所有对象。
标签: django iterator django-queryset