Django筛选器还是针对单个对象的GET?

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

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

我正和一些同事就此进行辩论。当你期待只有一个时,有没有一种首选的方式来检索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

扫码关注云+社区