Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的大django查询集';s if条件表达式_Python_Django_Django Queryset - Fatal编程技术网

Python中的大django查询集';s if条件表达式

Python中的大django查询集';s if条件表达式,python,django,django-queryset,Python,Django,Django Queryset,我有一个查询集,在下面的代码中使用 result = 1 if queryset else 0 在小queryset的情况下,这是可以的,但当queryset变得更大(超过50万个结果)时,程序冻结,需要一些时间来停止它 在上面的代码中测试Django的queryset时,幕后发生了什么? 检查期间是否进行了额外工作 即使查询集很大,调用count()或iterator()或任何其他方法也没有问题,问题出现的地方就是条件表达式 编辑: Queryset太大了。它填充Queryset的self.

我有一个查询集,在下面的代码中使用

result = 1 if queryset else 0
在小queryset的情况下,这是可以的,但当queryset变得更大(超过50万个结果)时,程序冻结,需要一些时间来停止它

在上面的代码中测试Django的queryset时,幕后发生了什么? 检查期间是否进行了额外工作

即使查询集很大,调用
count()
iterator()
或任何其他方法也没有问题,问题出现的地方就是条件表达式

编辑:

Queryset太大了。它填充Queryset的
self.\u result\u cache
。对于
len()
和在for循环中迭代queryset,也会发生同样的情况。

Python将使用
\uuubool\uuu
\uu len\uu
方法来获取对象的属性,并且它看起来像
queryset
类的实现会获取所有记录:


如果queryset.count()或者
如果queryset.exists()
如果这是您想要的,那么使用
可能是一个更好的主意。

@Selcuk我理解这一点,并希望它能够获取所有内容。然而,我一直在玩大型查询集,比如迭代、切片和其他所有东西,它从未冻结程序。条件表达式冻结的原因可能是什么。顺便说一句,我不需要解决问题,我解决了我的问题,我只是想知道在这种情况下会发生什么。@Selcuk在你发布的uu bool\uu调用u fetch\u all()和u iter\uuu或u len\uuu中,不同的是调用了bool函数。好的,我尝试了更多的函数行
len()
或在查询集上迭代,它也会冻结,直到程序被终止,我猜它太大了。虽然我记得前几天在同一个queryset上迭代时没有遇到任何问题。是的,当我看到你的第一条评论时,我很惊讶,因为
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。很高兴看到你上次的测试证实了这一点。
def __bool__(self):
    self._fetch_all()
    return bool(self._result_cache)