我有一个在下面的代码中使用的查询集。
result = 1 if queryset else 0
在小查询集的情况下没关系,但是当查询集变大(超过 500 000 个结果)程序卡住时,需要一些时间来停止它。
在上面的代码中测试 Django 的查询集时,幕后发生了什么?
在检查期间是否进行了一些额外的工作?
即使查询集很大,调用
count()
或 iterator()
或任何其他方法都没有问题,问题出现在条件表达式中。编辑:
查询集太大。它填充 Queryset 的
self._result_cache
。 len()
和在 for 循环中迭代查询集也会发生同样的事情。 最佳答案
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()
可能是一个更好的主意。关于python - Python 的 if 条件表达式中的大 django 查询集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57503778/