首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在django中从查询集中获取第一个对象的最快方法?

在django中从查询集中获取第一个对象的最快方法?
EN

Stack Overflow用户
提问于 2011-02-26 07:26:15
回答 8查看 260.9K关注 0票数 260

我经常发现自己想从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时,这是一件非常耗费内存的事情。

我怎样才能只用一个数据库调用就能做到这一点,而不会用异常对象搅动内存呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-11-18 22:07:43

使用方便的方法.first().last()

MyModel.objects.filter(blah=blah).first()

如果查询集不返回任何对象,则它们都接受结果异常并返回None

这些是在Django1.6中添加的,也就是released in Nov 2013

票数 428
EN

Stack Overflow用户

发布于 2011-03-02 08:58:14

您可以使用array slicing

Entry.objects.all()[:1].get()

它可以与.filter()一起使用

Entry.objects.filter()[:1].get()

您不希望首先将其转换为列表,因为这将强制对所有记录进行完整的数据库调用。只需执行上面的操作,它只会拉出第一个。你甚至可以使用.order_by()来确保你得到你想要的第一个。

一定要添加.get(),否则将返回一个QuerySet而不是一个对象。

票数 158
EN

Stack Overflow用户

发布于 2011-02-26 07:30:36

r = list(qs[:1])
if r:
  return r[0]
return None
票数 48
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5123839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档