Django何时执行数据库查找?

时间:2009-11-10 10:41:49

标签: sql django filtered-lookup

从以下代码:

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个吗?

2 个答案:

答案 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的更多信息。