将 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()
通常只会稍微检查 效率较低。
很多时候,需要检查 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()
通常只会稍微检查 效率较低。