我经常发现自己想从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时,这是一件非常耗费内存的事情。
我怎样才能只用一个数据库调用就能做到这一点,而不会用异常对象搅动内存呢?
发布于 2013-11-18 22:07:43
MyModel.objects.filter(blah=blah).first()
如果查询集不返回任何对象,则它们都接受结果异常并返回None
。
这些是在Django1.6中添加的,也就是released in Nov 2013。
发布于 2011-03-02 08:58:14
您可以使用array slicing
Entry.objects.all()[:1].get()
它可以与.filter()
一起使用
Entry.objects.filter()[:1].get()
您不希望首先将其转换为列表,因为这将强制对所有记录进行完整的数据库调用。只需执行上面的操作,它只会拉出第一个。你甚至可以使用.order_by()
来确保你得到你想要的第一个。
发布于 2011-02-26 07:30:36
r = list(qs[:1])
if r:
return r[0]
return None
https://stackoverflow.com/questions/5123839
复制相似问题