Самый быстрый способ получить первый объект из набора запросов в django?

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

Как я могу сделать это с помощью всего лишь одного вызова базы данных и без перемешивания памяти объектами исключения?

176
задан Leopd 25 February 2011 в 23:26
поделиться