Często mam ochotę pobrać pierwszy obiekt z zestawu zapytań w Django lub zwrócić, None
jeśli nie ma żadnych. Istnieje wiele sposobów na zrobienie tego, które wszystkie działają. Ale zastanawiam się, który jest najbardziej wydajny.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Czy to powoduje dwa wywołania bazy danych? To wydaje się marnotrawstwem. Czy to jest szybsze?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Inną opcją byłoby:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Generuje to pojedyncze wywołanie bazy danych, co jest dobre. Wymaga to jednak częstego tworzenia obiektu wyjątku, co wymaga dużej ilości pamięci, gdy wszystko, czego naprawdę potrzebujesz, to banalny test wstępny.
Jak mogę to zrobić za pomocą jednego wywołania bazy danych i bez utraty pamięci z obiektami wyjątków?
first()
i last()
wygodę metod: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
Ogólna zasada: jeśli martwisz się minimalizacją zwrotów bazy danych w obie strony, nie używaj zestawu zapytań, zawsze używaj.count()
.