检查Django中的空查询集

时间:2009-09-07 05:50:42

标签: django django-queryset

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

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

我想有几种不同的检查方法,但我想知道有经验的Django用户会怎么做。 文档中的大多数示例都忽略了没有找到任何内容的情况......

7 个答案:

答案 0 :(得分:166)

从版本1.2开始,Django拥有QuerySet。 exists() 方法,效率最高:

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

但是如果你要评估QuerySet,最好使用:

if orgs:
   ...

了解更多信息read QuerySet.exists() documentation

答案 1 :(得分:151)

if not orgs:
    # Do this...
else:
    # Do that...

答案 2 :(得分:15)

如果你有大量的物体,这可能(有时)要快得多:

try:
    orgs[0]
    # If you get here, it exists...
except IndexError:
    # Doesn't exist!

在我正在使用庞大数据库的项目上,not orgs为400毫秒,orgs.count()为250毫秒。在我最常见的用例(有结果的用例)中,这种技术通常可以达到20ms以下。 (我发现一个案例,那是6个。)

当然可能要长得多,具体取决于数据库查找结果所需的距离。或者甚至更快,如果它快速找到一个; YMMV。

编辑:如果找不到结果,此 通常会慢于orgs.count(),特别是如果你过滤的情况很少见;因此,它在视图函数中特别有用,您需要确保视图存在或抛出Http404。 (人们会希望,人们会要求存在的URL经常发生。)

答案 3 :(得分:10)

检查查询集的空白:

if orgs.exists():
    # Do something

或者您可以检查查询集中的第一个项目,如果它不存在,它将返回None

if orgs.first():
    # Do something

答案 4 :(得分:7)

最有效的方式(在django 1.2之前)是这样的:

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

答案 5 :(得分:5)

我不同意谓词

if not orgs:

应该是

if not orgs.count():

我遇到了一个相当大的结果集(约150k结果)的问题。操作符不会在QuerySet中重载,因此在进行检查之前,结果实际上是作为列表解压缩的。在我的情况下,执行时间减少了三个订单。

答案 6 :(得分:0)

您还可以使用此:

if(not(orgs)): #if orgs is empty else: #if orgs is not empty