从Django中的Queryset获取第一个对象的最快方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (194)

我经常发现自己想从Django的queryset获取第一个对象,或者返回。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。

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

提问于
用户回答回答于
用户回答回答于

正确的答案是

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

可用于:

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

可能不希望首先将其转换为列表,因为这将强制对所有记录进行完整的数据库调用。只要做上面的事,它只会拉第一个。你甚至可以用.order_by确保你得到了你想要的第一个。

确保添加.get()否则,将得到一个QuerySet,而不是一个对象。

扫码关注云+社区