Часто мне хочется получить первый объект из набора запросов в 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-тест.
Как я могу сделать это с помощью всего одного вызова базы данных и без использования памяти с объектами исключений?
first()
и last()
удобные методы: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
наборы запросов, всегда используйте.count()
.