检查查询是否返回任何结果的推荐习语是什么? 例子:

orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
    # Do this with the results without querying again.
# Else, do something else...

我想有几种不同的检查方法,但我想知道一个有经验的Django用户会怎么做。 文档中的大多数例子都忽略了什么都没有发现的情况……


当前回答

检查一个queryset是否为空:

if orgs.exists():
    # Do something

或者你可以检查一个queryset中的第一项,如果它不存在,它将返回None:

if orgs.first():
    # Do something

其他回答

最有效的方法(在django 1.2之前)是:

if orgs.count() == 0:
    # no results
else:
    # alrigh! let's continue...

你也可以用这个:

如果不是(组织)): #if orgs为空 其他: #if orgs不为空

我不同意这个谓词

if not orgs:

应该是这样

if not orgs.count():

我遇到了同样的问题,一个相当大的结果集(~150k结果)。在QuerySet中运算符没有重载,因此在进行检查之前,结果实际上是作为列表解包的。在我的案例中,执行时间缩短了三次。

if not orgs:
    # The Queryset is empty ...
else:
    # The Queryset has results ...

从1.2版开始,Django就有了QuerySet.exists()方法,这是最有效的方法:

if orgs.exists():
    # Do this...
else:
    # Do that...

但是如果你想对QuerySet求值,最好使用:

if orgs:
   ...

有关更多信息,请参阅QuerySet.exists()文档。