我经常发现自己想从 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 测试时,这是一件非常耗费内存的事情。
我怎样才能只用一个数据库调用而不用异常对象搅动内存?
最佳答案
Django 1.6 (released Nov 2013)介绍了convenience methods first()
和 last()
吞下产生的异常并在查询集没有返回任何对象时返回 None
。
关于python - 从 django 的查询集中获取第一个对象的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5123839/