Часто мне хочется получить первый объект из набора запросов в Django или вернуть 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-тест.
Как я могу сделать это только с одной базой данныхВызов и без сбивания памяти с исключениями объектов?