Ich hatte mit einigen Kollegen eine Debatte darüber. Gibt es eine bevorzugte Möglichkeit, ein Objekt in Django abzurufen, wenn Sie nur eines erwarten?
Die zwei offensichtlichen Wege sind:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
Und:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
Die erste Methode scheint verhaltensmäßig korrekter zu sein, verwendet jedoch Ausnahmen im Kontrollfluss, die einen gewissen Overhead verursachen können. Der zweite ist mehr Kreisverkehr, wird aber nie eine Ausnahme auslösen.
Irgendwelche Gedanken darüber, welche davon vorzuziehen sind? Welches ist effizienter?
QS.get()
ist es gut. 2. Details sind wichtig: Bedeutet "nur eines erwarten" immer 0-1 Objekte, oder es ist möglich, 2+ Objekte zu haben, und dieser Fall sollte auch behandelt werden (in diesem Falllen(objs)
ist eine schreckliche Idee)? 3. Nehmen Sie nichts über Overhead ohne Benchmark an (ich denke, dass in diesem Falltry/except
schneller sein wird, solange mindestens die Hälfte der Anrufe etwas