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

result = 1 if queryset else 0

在小查询集的情况下没关系,但是当查询集变大(超过 500 000 个结果)程序卡住时,需要一些时间来停止它。

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

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

编辑:
查询集太大。它填充 Queryset 的 self._result_cachelen() 和在 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/

10-12 16:35