从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?

下一篇: Good ways to sort a queryset?