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并在没有找到项目或找到多个对象时引发异常。

链接地址: http://www.djcxy.com/p/6581.html

上一篇: Django filter versus get for single object?

下一篇: or?