Python的if条件表达式中的大Django queryset

时间:2019-08-15 01:12:56

标签: python django django-queryset

我有一个用于以下代码的查询集。

result = 1 if queryset else 0

如果查询集较小,则可以,但是当查询集变大(超过500 000个结果)时,程序冻结,则需要一些时间才能将其停止。

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

即使查询集很大,调用count()iterator()或任何其他方法都没有问题,但问题所在就是条件表达式。

编辑:
Queryset太大。它填充Queryset的self._result_cachelen()会发生同样的事情,并在for循环中遍历queryset。

1 个答案:

答案 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()