检查Django中的空查询集

7rfyedvj  于 2022-12-01  发布在  Go
关注(0)|答案(7)|浏览(110)

检查查询是否返回任何结果的建议习惯用法是什么?
示例:

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

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

idv4meu8

idv4meu81#

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

qv7cva1a2#

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

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

但如果您无论如何都要计算QuerySet,则最好使用:

if orgs:
   ...

有关详细信息,请阅读QuerySet.exists()文档。

u0njafvf

u0njafvf3#

检查查询集是否为空:

if orgs.exists():
    # Do something

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

if orgs.first():
    # Do something
kcugc4gi

kcugc4gi4#

如果您有大量的对象,这(有时)会快得多:

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

在我正在处理的一个大型数据库项目中,not orgs是400多毫秒,orgs.count()是250毫秒。在我最常见的用例(有结果的用例)中,这种技术通常会将时间缩短到20毫秒以下。(我发现的一个用例是6毫秒。)
当然,时间可能会更长,这取决于数据库要查找到什么程度才能找到结果。YMMV公司。
EDIT:如果没有找到结果,这通常会比orgs.count()慢,特别是当你过滤的条件很少见的时候;因此,在需要确保视图存在或抛出Http 404的视图函数中,它特别有用。(人们希望,在这种情况下,人们请求的URL经常存在。)

rur96b6h

rur96b6h5#

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

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

irlmq6kh6#

我不同意 predicate

if not orgs:

应该是

if not orgs.count():

我在一个相当大的结果集(大约150k个结果)中遇到了同样的问题。QuerySet中的运算符没有过载,所以在检查之前,结果实际上是作为一个列表解包的。在我的例子中,执行时间减少了三个订单。

a8jjtwal

a8jjtwal7#

您还可以使用以下命令:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty

相关问题