我正在与一些同事就此进行辩论。当您只期望一个对象时,是否有一种在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
第一种方法在行为上似乎更正确,但是在控制流中使用异常,这可能会带来一些开销。第二个是回旋处,但永远不会引发例外。
有什么想法是可取的?哪个更有效?
QS.get()
就是很好的原因 。2.细节很重要:“只期待一个”总是意味着0-1个对象,还是可能有2个以上的对象,这种情况也应该处理(在这种情况下,这len(objs)
是一个糟糕的主意)?3.在没有基准的情况下,不要假设任何开销(我认为在这种情况下try/except
,只要至少有一半的电话返回某些内容,它将更快)