我经常发现自己想从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

另一个 Select 是:

qs = MyModel.objects.filter(blah = blah)
try:
    return qs[0]
except IndexError:
    return None

这会生成一个数据库调用,这很好.但需要大量时间创建一个异常对象,这是一件非常占用内存的事情,而您真正需要的只是一个微不足道的if测试.

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

推荐答案

Django 1.6 (released Nov 2013)引入了convenience methodsfirst()last(),它们吞并了产生的异常,如果queryset不返回任何对象,则返回None.

Python相关问答推荐

在后台运行的Python函数

定义同侪组并计算同侪组分析

仅对matplotlib的条标签中的一个条标签应用不同的格式

Pandas 第二小值有条件

线性模型PanelOLS和statmodels OLS之间的区别

Pydantic 2.7.0模型接受字符串日期时间或无

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

Python中绕y轴曲线的旋转

当独立的网络调用不应该互相阻塞时,'

如何创建一个缓冲区周围的一行与manim?

如何从pandas的rame类继承并使用filepath实例化

创建可序列化数据模型的最佳方法

提取相关行的最快方法—pandas

计算天数

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

将一个双框爆炸到另一个双框的范围内

以异步方式填充Pandas 数据帧

如何在Gekko中使用分层条件约束

从一个df列提取单词,分配给另一个列