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