Spesso mi ritrovo a voler ottenere il primo oggetto da un queryset in Django, o tornare None
se non ce ne sono. Ci sono molti modi per farlo che funzionano tutti. Ma mi chiedo quale sia il più performante.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Ciò comporta due chiamate al database? Sembra uno spreco. È più veloce?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Un'altra opzione sarebbe:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Questo genera una singola chiamata al database, il che è positivo. Ma richiede la creazione di un oggetto eccezione per la maggior parte del tempo, il che è una cosa molto dispendiosa in termini di memoria quando tutto ciò di cui hai veramente bisogno è un banale if-test.
Come posso farlo con una sola chiamata al database e senza sfornare la memoria con oggetti eccezione?
first()
e last()
convenienza metodi: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
sui set di query, utilizza sempre.count()
.