if和if之间的区别()?

时间:2014-02-28 09:07:21

标签: django django-queryset

获取任何给定的查询集qs = QS.objects.filter(active=True)

我之间有区别吗?

if qs:

if qs.exists():

关于db等的负载?

3 个答案:

答案 0 :(得分:5)

是的,有区别:

  • if qs将使用QuerySet对象的__nonzero__方法,该方法会调用_fetch_all,而exists()实际上会执行完整查询(这就是我解释它的方式)
  • exists()更有效率,noted by Ewan。这就是为什么这种方法存在的原因。

因此,简而言之,当需要检查是否存在时,请使用{{1}},因为这就是它的用途。

答案 1 :(得分:3)

来自exists()

的文档
  

如果QuerySet包含任何结果,则返回True,否则返回False。这会尝试以最简单,最快的方式执行查询,但它确实执行与普通QuerySet查询几乎相同的查询。

     

exists()对于QuerySet中的对象成员资格和QuerySet中任何对象的存在都很有用,特别是在大型QuerySet的上下文中。

然而,他们接着展示了一些示例,并得出结论:if qs vs if qs.exists()需要一个大型查询集来提高效率。

文档的最后警告:

  

此外,如果尚未评估some_queryset,但您知道它将在某个时间点,那么使用some_queryset.exists()将会执行更多整体工作(一个查询存在性检查加上额外的一个以便稍后检索结果)而不是简单地使用bool(some_queryset),它检索结果然后检查是否返回了结果。

答案 2 :(得分:0)

它产生相同的结果。来自https://docs.djangoproject.com/en/dev/ref/models/querysets/

的帮助

<强>存在()

如果QuerySet包含任何结果,则返回True,否则返回False。

<强> BOOL()

在布尔上下文中测试QuerySet,将导致查询被执行。如果至少有一个结果,则QuerySet为True,否则为False。