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