我有一个用于以下代码的查询集。
result = 1 if queryset else 0
如果查询集较小,则可以,但是当查询集变大(超过500 000个结果)时,程序冻结,则需要一些时间才能将其停止。
在上面的代码中测试Django的queryset时,幕后发生了什么? 在检查期间是否还要做一些额外的工作?
即使查询集很大,调用count()
或iterator()
或任何其他方法都没有问题,但问题所在就是条件表达式。
编辑:
Queryset太大。它填充Queryset的self._result_cache
。 len()
会发生同样的事情,并在for循环中遍历queryset。
答案 0 :(得分:3)
Python将使用__bool__
或__len__
方法来对对象进行test the truth value,并且看起来Queryset
类的实现将获取所有记录:>
https://github.com/django/django/blob/master/django/db/models/query.py#L279
def __bool__(self):
self._fetch_all()
return bool(self._result_cache)
如果这是您想要的,最好使用if queryset.count()
或if queryset.exists()
。