检查查询是否返回任何结果的建议习惯用法是什么?
示例:
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条答案
按热度按时间idv4meu81#
qv7cva1a2#
从1.2版本开始,Django有了QuerySet.**exists()**方法,这是最高效的方法:
但如果您无论如何都要计算QuerySet,则最好使用:
有关详细信息,请阅读QuerySet.exists()文档。
u0njafvf3#
检查查询集是否为空:
或者您可以检查查询集中的第一项,如果它不存在,则返回
None
:kcugc4gi4#
如果您有大量的对象,这(有时)会快得多:
在我正在处理的一个大型数据库项目中,
not orgs
是400多毫秒,orgs.count()
是250毫秒。在我最常见的用例(有结果的用例)中,这种技术通常会将时间缩短到20毫秒以下。(我发现的一个用例是6毫秒。)当然,时间可能会更长,这取决于数据库要查找到什么程度才能找到结果。YMMV公司。
EDIT:如果没有找到结果,这通常会比
orgs.count()
慢,特别是当你过滤的条件很少见的时候;因此,在需要确保视图存在或抛出Http 404的视图函数中,它特别有用。(人们希望,在这种情况下,人们请求的URL经常存在。)rur96b6h5#
最有效的方法(在django 1.2之前)是这样的:
irlmq6kh6#
我不同意 predicate
应该是
我在一个相当大的结果集(大约150k个结果)中遇到了同样的问题。QuerySet中的运算符没有过载,所以在检查之前,结果实际上是作为一个列表解包的。在我的例子中,执行时间减少了三个订单。
a8jjtwal7#
您还可以使用以下命令:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty