从django的查询集中获取第一个对象的最快方法是什么?
我经常发现自己想要从Django中的查询集中获取第一个对象,如果没有,则返回None
。 有很多方法可以做到这一点。 但我想知道哪个是最高性能的。
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
这是否会导致两个数据库调用? 这似乎很浪费。 这是否更快?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
另一种选择是:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
这会生成单个数据库调用,这很好。 但是需要很多时间创建一个异常对象,当你真正需要的只是一个简单的if-test时,这是一个非常耗费内存的事情。
我怎样才能做到这一点只需要一个数据库调用,而不用异常对象搅动内存?
Django 1.6(2013年11月发布)引入了便利方法first()
和last()
,该方法吞下产生的异常,如果queryset不返回对象,则返回None
。
正确的答案是
Entry.objects.all()[:1].get()
哪些可用于:
Entry.objects.filter()[:1].get()
您不希望首先将其转换为列表,因为这会强制执行所有记录的完整数据库调用。 只要做到上述,它只会拉第一个。 你甚至可以使用.order_by
来确保你得到你想要的第一个。
一定要添加.get()
,否则你将得到一个QuerySet而不是一个对象。
r = list(qs[:1])
if r:
return r[0]
return None
链接地址: http://www.djcxy.com/p/38713.html
上一篇: Fastest way to get the first object from a queryset in django?