我和一些同事就这个问题进行了辩论。

两种明显的方法是:

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 中实现的,因此不应该有"性能"差异(事实上,您正在考虑它,这表明您违反了编程的基本规则之一,即在编写代码之前尝试对其进行优化)

来自: stackoverflow.com