Prowadziłem debatę na ten temat z kilkoma kolegami. Czy istnieje preferowany sposób pobierania obiektu w Django, gdy spodziewasz się tylko jednego?
Dwa oczywiste sposoby to:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
I:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
Pierwsza metoda wydaje się bardziej poprawna behawioralnie, ale używa wyjątków w przepływie sterowania, co może powodować pewne obciążenie. Drugi jest bardziej okrężny, ale nigdy nie spowoduje wyjątku.
Jakieś przemyślenia, które z nich są lepsze? Który jest bardziej wydajny?
QS.get()
jest dobry. 2. Szczegóły mają znaczenie: czy „oczekiwanie tylko jednego” oznacza zawsze 0-1 obiektów, czy też można mieć 2+ obiektów i ten przypadek też powinien być załatwiony (w tym przypadkulen(objs)
jest to okropny pomysł)? 3. Nie zakładaj niczego na temat narzutów bez benchmarku (myślę, że w tym przypadkutry/except
będzie szybciej, o ile przynajmniej połowa połączeń coś zwróci)