如果和如果存在()之间的区别?



获取任何给定的查询集,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 qsif 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。

相关内容

最新更新