Часто мені здається, що я хочу отримати перший об’єкт із набору запитів у 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()
на querysets, завжди використовуйте.count()
.