Django过滤器与获取单个对象?
我正和一些同事就此进行辩论。 当你期待只有一个时,有没有一种首选的方式来检索Django中的对象?
两种明显的方法是:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# we have no object! do something
pass
和
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# we have no object! do something
pass
第一种方法似乎在行为上更加正确,但在控制流中使用异常可能会带来一些开销。 第二个是更迂回,但不会提出例外。
任何想法哪个更好? 哪个更有效率?
get()
是专门为这种情况提供的。 用它。
选项2几乎正是get()
方法在Django中实际实现的方式,因此不应该存在“性能”差异(并且您考虑这一点的事实表明您违反了编程的基本规则之一,即在甚至编写和分析代码之前尝试优化代码 - 直到您拥有代码并可以运行代码,您不知道代码如何执行,并在之前尝试优化是一种痛苦的途径)。
您可以安装一个名为django-annoying的模块,然后执行此操作:
from annoying.functions import get_object_or_None
obj = get_object_or_None(MyModel, id=1)
if not obj:
#omg the object was not found do some error stuff
1是正确的。 在Python中,异常与返回相同。 对于一个简单的证明,你可以看看这个。
2这是Django在后端做的事情。 get
调用filter
并在没有找到项目或找到多个对象时引发异常。
上一篇: Django filter versus get for single object?
下一篇: or?