从以下代码:
dvdList = Dvd.objects.filter(title = someDvdTitle)[:10]
for dvd in dvdList:
result = "Title: "+dvd.title+" @ "+dvd.price+"."
Django什么时候进行查找?也许这只是偏执狂,但似乎如果我注释掉for循环,它会更快地返回。第一行是设置过滤器然后for循环执行它,还是我完全糊涂了?这些代码行实际发生了什么?
编辑:
如果我将objects.filter限制为'1000'然后在for循环中实现了一个计数器,在10次迭代后突破它会发生什么。这实际上只能获得10个值或1000个吗?
答案 0 :(得分:3)
Django查询集是懒惰地评估的,所以是的,在你尝试从中获取值之前,查询实际上不会执行(正如你在for
循环中所做的那样)。
来自文档:
您可以通过以下方式评估QuerySet:
迭代。 QuerySet是可迭代的,并且 它执行其数据库查询 第一次迭代它。对于 例如,这将打印标题 数据库中的所有条目:
for e in Entry.objects.all(): print e.headline
...(剪断)...
请参阅When Querysets are evaluated。
根据你的编辑:
如果你将过滤器限制为1000,然后在10次迭代后在for循环中实现了一个计数器,那么你就会在数据库中找到所有1000行--Django没有办法提前知道您将如何处理Queryset - 它只知道您需要一些数据,因此评估它构建的查询字符串。
答案 1 :(得分:0)
使用list()
或查询的任何其他eval方法一次评估所有内容也可能更好。我发现它有时会提高性能(每次都不需要为数据库连接付费)。
查找有关django何时评估here的更多信息。