获取任何给定的查询集qs = QS.objects.filter(active=True)
我之间有区别吗?
if qs:
和
if qs.exists():
关于db等的负载?
答案 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。