我最近遇到了一些奇怪的行为,需要检查一下我的理解。
我在模型中使用了一个简单的过滤器,然后迭代结果。
e.g。
allbooks = Book.objects.filter(author = 'A.A. Milne')
for book in allbooks:
do_something(book)
奇怪的是,它只返回了部分书籍清单。
但是,当使用相同的代码并使用iterator()时,这似乎运行良好。
即
for book in allbooks.iterator():
do_something(book)
知道为什么吗?
P.S。我确实浏览了django文档,但是看不到qeuryset如何在其他任何地方缓存...
iterator()
计算QuerySet(通过执行查询)并在结果上返回迭代器。 QuerySet通常在内部缓存其结果,以便重复的评估不会导致其他查询;iterator()
将直接读取结果,而不在QuerySet级别执行任何缓存。对于返回大量对象的QuerySet,这通常会带来更好的性能并显着降低内存请注意,在已经评估的QuerySet上使用
iterator()
会强制它再次评估,重复查询。
答案 0 :(得分:16)
奇怪的是,它只返回了一部分 书籍清单。
这不是查询集必须如何工作的方式。迭代查询集应该为您提供数据库返回的每条记录。调试你的代码。你会发现错误,否则再次调试。
检查REPL很容易。运行manage.py shell
:
from app.models import Model
for o in Model.objects.filter(fieldname="foo"): print o
#Let's see DB query
from django.db import connection
print(connection.queries)
答案 1 :(得分:1)
QuerySet通常在内部缓存其结果,以便重复的评估不会导致其他查询。相比之下,iterator()
会直接读取结果,而不会在QuerySet
级别进行任何缓存。