检查查询是否返回任何结果的推荐习惯是什么? 例如:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
我想有几种不同的检查方法,但我想知道有经验的Django用户会怎么做。 文档中的大多数示例都忽略了没有找到任何内容的情况......
答案 0 :(得分:166)
从版本1.2开始,Django拥有QuerySet。 exists() 方法,效率最高:
if orgs.exists():
# Do this...
else:
# Do that...
但是如果你要评估QuerySet,最好使用:
if orgs:
...
答案 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