我正在与一些同事就此进行辩论。当你只期望一个对象时,是否有一种首选的方法可以在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中的实际实现方式,因此应该没有“性能”差异(而且你正在考虑的事实表明你在违反编程的基本原则之一,即试图在甚至没有编写和分析代码之前就对代码进行优化-在没有代码并可以运行之前,你不知道代码将如何执行,在此之前尝试进行优化是一条痛苦的路。