Oft möchte ich das erste Objekt aus einem Abfragesatz in Django holen oder zurückkehren, None
wenn es keine gibt. Es gibt viele Möglichkeiten, die alle funktionieren. Aber ich frage mich, welches am performantesten ist.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Führt dies zu zwei Datenbankaufrufen? Das scheint verschwenderisch. Geht das schneller?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Eine andere Option wäre:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Dies erzeugt einen einzelnen Datenbankaufruf, was gut ist. Es ist jedoch erforderlich, häufig ein Ausnahmeobjekt zu erstellen. Dies ist sehr speicherintensiv, wenn Sie nur einen trivialen Wenn-Test benötigen.
Wie kann ich dies mit nur einem einzigen Datenbankaufruf tun, ohne den Speicher mit Ausnahmeobjekten zu belasten?
first()
und last()
bequemen Methoden hinzugefügt : docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
Gedanken über die Minimierung von DB- Roundtrips machen, verwenden Sie diese nicht für Abfragesätze, sondern immer.count()
.