ObjectDoesNotExist与.filter()。first()并检查是否为None

lszrh

在Django 1.6中,他们引入.first()了获取查询集的第一个元素。[来源]

现在有两种获取单个元素的方法:

user_id = 42
try:
    obj = User.objects.get(id=user_id)
except ObjectDoesNotExist:
    raise Exception("Invalid user id given")

和:

user_id = 42
obj = User.objects.filter(id=user_id).first()
if not obj:
    raise Exception("Invalid user id given")

遵循pythonic方式请求宽恕,第一个将是更受赞赏的使用方式。但是,第二个可能更容易理解,并且短了一行。

问题1:这两个代码段之间的速度是否有差异?

问题2:获取单个对象的首选方法是什么?

n

两者具有不同的语义和不同的保证。主要区别在于它们如何处理多个匹配的对象。

.get()如果多个对象与给定查询匹配,将引发异常。因此,您应该使用.get()来基于唯一属性(例如id)或一组属性来获取项目

.first()如果多个对象与给定查询匹配,则将基于定义的顺序返回第一项。当需要单个项目时,可使用此选项过滤非唯一属性,第一个基于某些(可能未定义)排序。

因此,尽管.get()保证一个项目与查询完全匹配,但.first()仅保证它根据给定的顺序返回第一个项目。

他们如何处理丢失的对象更多是语义问题。将异常转换为None或以其他方式转换是微不足道的尽管您可能会在这里和那里保存一行,但我不会因此而决定使用另一行。性能差异也可以忽略不计,并且可能取决于查询的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ObjectDoesNotExist vs. .filter().first() and check for None

来自分类Dev

Django Model.ObjectDoesNotExist异常

来自分类Dev

Django Model.ObjectDoesNotExist异常

来自分类Dev

检查PyObject是否为None

来自分类Dev

检查xml ElementTree节点是否为None / False

来自分类Dev

检查与指定函数同名的类实例变量是否为None

来自分类Dev

检查返回值是否为Py_None的实例

来自分类Dev

如何检查TR是否被隐藏或TD的a是我的ID是否为'display:none'类

来自分类Dev

如何在javascript中检查Django对象是否为None?

来自分类Dev

检查Python列表中的任何项目是否为None(但包括零)

来自分类Dev

如何检查Django表单数据是否为None,''(空字符串)或False

来自分类Dev

检查变量是否为none,但如果仅一个对象/数组,则通过

来自分类Dev

如何以pythonic的方式检查字典的某些变量和特定键是否为None?

来自分类Dev

春季:在代码中检查url的安全性是否设置为none

来自分类Dev

如何获取python列表中的第一个元素并检查它是否为None?

来自分类Dev

检查是否为空

来自分类Dev

检查NSURL是否为目录

来自分类Dev

检查类型是否为地图

来自分类Dev

检查Iterable是否为Map

来自分类Dev

检查整数是否为空

来自分类Dev

检查链接是否为图片

来自分类Dev

检查序列是否为timedelta

来自分类Dev

检查输入是否为元音

来自分类Dev

检查条件是否为假

来自分类Dev

检查数字是否为NaN

来自分类Dev

检查画布是否为黑色

来自分类Dev

检查会话是否为空

来自分类Dev

检查argv是否为目录

来自分类Dev

检查日期是否为DSTShifted