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)