从django中的queryset获取第一个对象的最快方法?

问题:

通常我发现自己想要从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 (released Nov 2013)引入了convenience methods first()last(),如果查询器没有返回任何对象,那么它会吞噬生成的异常并返回None

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Fastest way to get the first object from a queryset in django?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 51 = 55