通常我发现自己想要从Django的查询集中获取第一个对象,如果没有则返回
这会导致两次数据库调用吗?这似乎有些浪费。这样做会更快吗?
另一个选项是:
这会生成单个数据库调用,这是不错的。但是大多数情况下需要创建异常对象,这在实际上只需要一个简单的 if-测试时会占用很多内存。
我怎样才能只使用一个数据库调用,并且不通过创建异常对象来消耗内存呢?
None
。有很多方法可以实现这个目标,它们都能正常工作。但我想知道哪种方法性能最好。qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
这会导致两次数据库调用吗?这似乎有些浪费。这样做会更快吗?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
另一个选项是:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
这会生成单个数据库调用,这是不错的。但是大多数情况下需要创建异常对象,这在实际上只需要一个简单的 if-测试时会占用很多内存。
我怎样才能只使用一个数据库调用,并且不通过创建异常对象来消耗内存呢?
len()
,而应该始终使用.count()
。 - Daniel DiPaolofirst()
和last()
工具方法,详情请见:https://docs.djangoproject.com/en/dev/ref/models/querysets/#first - Wei Yenlen
更好。请参见https://docs.djangoproject.com/en/dev/topics/db/optimization/#don-t-overuse-count-and-exists - spookylukey