一尘不染

Django过滤器与获取单个对象?

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

第一种方法在行为上似乎更正确,但是在控制流中使用异常,这可能会带来一些开销。第二个是回旋处,但永远不会引发例外。

有什么想法是可取的?哪个更有效?


阅读 339

收藏
2020-04-03

共1个答案

一尘不染

get()是专门为这种情况提供的。用它。

选项2几乎完全是该get()方法在Django中的实际实现方式,因此应该没有“性能”差异(而且你正在考虑的事实表明你在违反编程的基本原则之一,即试图在甚至没有编写和分析代码之前就对代码进行优化-在没有代码并可以运行之前,你不知道代码将如何执行,在此之前尝试进行优化是一条痛苦的路。

2020-04-03