将 any 与 QuerySet 一起使用不是最优的吗?

Is using any with a QuerySet unoptimal?

很多时候,需要检查 QuerySet 中是否至少有一个元素。大多数情况下,我使用 exists:

if queryset.exists():
   ...

但是,我看到同事使用 python 的 any 函数:

if any(queryset):
   ...

使用 python 的 any 函数是否不是最优的?

我的直觉告诉我,这是一个与 between using count and len 类似的困境:any 将遍历 QuerySet,因此需要对其求值。在我们将使用 QuerySet 项目的情况下,这不会造成任何减速。但是,如果我们只需要检查是否存在任何满足查询的数据,这可能会加载我们不需要的数据。

Is using python's any function unoptimal?

最 Pythonic 的方式是:

if <strong>queryset</strong>:
    # …

事实上,如果 QuerySet 包含至少一项,则 QuerySet 具有 真实性 True,否则 False

如果您稍后想要枚举查询集(例如使用 for 循环),如果您检查其真实性,它将加载缓存中的项目,例如:

if queryset:
    for item in queryset:
        # …

只会对数据库进行 一个 查询:当您检查 if queryset 时,该查询将获取所有项目,然后您可以重用该缓存而无需进行第二个查询。

如果您 not 稍后在过程中使用查询集,那么您可以使用 .exists() [Django-doc]:这将 not 在内存中加载记录,但只进行查询以检查是否至少存在一个这样的记录,因此在应用程序和数据库之间的带宽方面成本较低。但是,如果您稍后必须使用查询集,使用 .exists() 不是 一个好主意,因为那时我们进行了两个查询。

然而,使用 any(queryset) 是 non-sensical:您可以通过其真实性检查查询集是否包含元素,因此使用 any() 通常只会稍微检查 效率较低。