获取任何给定的查询集,qs = QS.objects.filter(active=True)
我之间有区别吗:
if qs:
和
if qs.exists():
关于数据库上的负载等?
是的,有区别:
if qs
将使用QuerySet
对象的__nonzero__
方法,该方法调用_fetch_all
,而又将实际执行完整查询(无论如何,这就是我的解释方式)。- 正如Ewan所指出的那样,
exists()
做了一些更有效的事情。这就是为什么这种方法...存在。
因此,简而言之,当您只需要检查是否存在时,请使用exists()
,因为这就是它的用途。
来自exists()
的文档
如果 QuerySet 包含任何结果,则返回
True
,如果没有,则返回False
。这会尝试以最简单、最快的方式执行查询,但它执行的查询与普通 QuerySet 查询几乎相同。
exists()
对于与 QuerySet 中的对象成员身份和 QuerySet 中是否存在任何对象相关的搜索非常有用,尤其是在大型 QuerySet 的上下文中。
然而,他们接着展示了一些例子,并得出结论,if qs
与if qs.exists()
需要一个大的查询集来提高效率。
文档中的最后一个警告:
此外,如果尚未评估
some_queryset
,但您知道它会在某个时候进行评估,那么使用some_queryset.exists()
将比简单地使用bool(some_queryset)
执行更多的整体工作(一个查询用于存在检查,加上一个额外的查询用于稍后检索结果)。
它产生相同的结果。从帮助 https://docs.djangoproject.com/en/dev/ref/models/querysets/
存在()
如果查询集包含任何结果,则返回 True;如果不包含,则返回 False。
布尔()
在布尔上下文中测试 QuerySet ...,将导致执行查询。如果至少有一个结果,则 QuerySet 为 True,否则为 False。