244

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

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

我想有几种不同的方法可以检查这一点,但我想知道有经验的 Django 用户会如何做到这一点。文档中的大多数示例只是忽略了没有找到任何东西的情况......

4

7 回答 7

283
if not orgs:
    # Do this...
else:
    # Do that...
于 2009-09-07T05:53:34.440 回答
243

从 1.2 版开始,Django 有了 QuerySet。最有效的exists()方法:

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

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

if orgs:
   ...

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

于 2010-03-03T18:14:20.450 回答
18

如果您有大量对象,这可以(有时)更快:

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

在一个我正在使用一个巨大的数据库的项目中,not orgs是 400+ 毫秒并且orgs.count()是 250 毫秒。在我最常见的用例(有结果的用例)中,这种技术通常会将其缩短到 20 毫秒以下。(我发现的一个案例是 6 个。)

当然,可能要长得多,这取决于数据库需要多远才能找到结果。或者甚至更快,如果它很快找到一个;YMMV。

编辑:这通常orgs.count()没有找到结果要慢,特别是如果您过滤的条件是罕见的;因此,它在需要确保视图存在或抛出 Http404 的视图函数中特别有用。(人们希望,人们要求的 URL 经常存在。)

于 2010-01-19T23:50:08.920 回答
18

检查查询集是否为空:

if orgs.exists():
    # Do something

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

if orgs.first():
    # Do something
于 2015-04-20T13:56:51.303 回答
12

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

if orgs.count() == 0:
    # no results
else:
    # alrigh! let's continue...
于 2009-09-07T06:01:57.850 回答
6

我不同意谓词

if not orgs:

它应该是

if not orgs.count():

我在相当大的结果集(〜150k结果)中遇到了同样的问题。该运算符在 QuerySet 中没有重载,因此在进行检查之前,实际上将结果解包为列表。就我而言,执行时间减少了三个订单。

于 2011-07-30T14:33:05.133 回答
0

你也可以使用这个:

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

于 2019-01-20T18:04:49.000 回答