Answers:
if not orgs:
# Do this...
else:
# Do that...
list
结果的a 。那里的代码将只访问数据库一次。如果他们曾经使用过exist()
或count()
首先要检查是否要返回记录,那么他们将两次访问数据库(一次检查一次,一次获取记录)。这是一个特定的情况。这并不意味着在一般情况下,知道查询是否将返回记录的首选方法是使用doif queryset:...
if not my_objects:
来说明这是他们在文档中的操作方式。其他所有内容都无关紧要,所以我不明白你的意思。他们也可以进行一千次查询,但这仍然完全无关紧要,因为这不是答案的重点,我明确表示同意。
get_object_or_404
作品,不检查任何元素是否在查询集存在的首选方式。在queryset上执行list()将获取一个queryset上的每个对象,如果返回的行很多,那将比两次查询更为糟糕。
.exists()
如果不会评估qs,则使用效率更高。
从1.2版开始,Django具有QuerySet。最有效的exist()方法:
if orgs.exists():
# Do this...
else:
# Do that...
但是,无论如何,如果要评估QuerySet,最好使用:
if orgs:
...
有关更多信息,请阅读QuerySet.exists()文档。
.get
不返回查询集。它返回一个对象。所以谷歌为此
如果您有大量的对象,这可能(有时)要快得多:
try:
orgs[0]
# If you get here, it exists...
except IndexError:
# Doesn't exist!
在一个我正在使用大型数据库的项目中,时间not orgs
是400毫秒以上,orgs.count()
。在我最常见的用例(有结果的情况)中,此技术通常会将其降至20ms以下。(我发现一个案例是6。)
当然,它可能更长一些,具体取决于数据库查找结果所需的距离。甚至更快,如果能够快速找到它的话;YMMV。
编辑:这将经常是慢orgs.count()
如果结果是找不到的,特别是如果你筛选的条件是难得的一个; 因此,它在需要确保视图存在或抛出Http404的视图函数中特别有用。(人们希望在那里,人们要求的URL经常存在。)
最有效的方法(在Django 1.2之前)是:
if orgs.count() == 0:
# no results
else:
# alrigh! let's continue...
我不同意谓词
if not orgs:
它应该是
if not orgs.count():
我遇到了同样的问题,结果集相当大(约有15万个结果)。运算符未在QuerySet中重载,因此实际上在进行检查之前将结果解压缩为列表。就我而言,执行时间减少了三个顺序。
您还可以使用以下命令:
if(not(orgs)):
#if orgs is empty
else:
#if orgs is not empty