在不预先填充缓存的情况下迭代Django QuerySet

时间:2017-10-12 23:29:57

标签: python django django-queryset

我想迭代QuerySet中的所有对象。但是,QuerySet匹配数十万甚至数百万个对象。因此,当我尝试启动迭代时,我的CPU使用率达到100%,我的所有内存都会填满,然后事情就会崩溃。这在第一个项目返回之前发生:

bts = Backtrace.objects.all()
for bt in bts:
  print bt

我可以要求一个单独的对象,它会立即返回:

bts = Backtrace.objects.all()
print(bts[5])

但是如上所述,所有对象的计数都会崩溃,所以我不能使用这种方法进行迭代,因为我不知道会有多少个对象。

什么是迭代方式而不会导致整个结果被预先缓存?

1 个答案:

答案 0 :(得分:3)

首先确保您了解查询集何时evaluated(点击数据库)。

当然,一种方法是filter查询集。

如果这是不可能的,根据您的需要,您可以使用一些变通方法:

这是一个很好的article,试图在更理论的层面上解决这个问题。