Próbuję zdobyć obiekt, jeśli istniał dobrze, jeśli nie, wtedy coś innego i tak dalej. Czy jest poprawny, aby wykonać następujące czynności? Słyszałem, że wyjątki są drogie i unikać Shuold, prawda?

try:
   user = User.objects.get(user=id)
except ObjectDoesNotExist:
   try:
       user = User.objects.get(email=id)
   except ObjectDoesNotExist:
       try:
        # ...

finally:
    # do the final thing
0
eneepo 8 grudzień 2013, 16:19

2 odpowiedzi

Najlepsza odpowiedź

Są nieco drogie, ale na pewno nie są zbyt drogie, aby użyć w razie potrzeby. Byłbym bardziej zaniepokojony młotkiem bazy danych z wieloma zapytaniami, możesz uniknąć obu problemów, otrzymując wyniki dla wszystkich możliwych pól z powrotem w jednym zapytaniu.

from django.contrib.auth.models import User
from django.db.models import Q
user = User.objects.filter(Q(user=id) | Q(email=id) | [...])[0]

Opiera się na Django's q-obiektów , co pozwala na tworzenie warunków połączonych razem w bardziej złożonych sposobach niż zwykłe i dołącza, że zwykle dostajesz podczas budowy filtrów. Jeśli nie martwisz się o możliwość uzyskania wielu obiektów, nadal można użyć metody get(), jak w swoim przykładzie.

1
jcdyer 8 grudzień 2013, 12:39

Koszt spróbowania / oprócz tego wyjaśniono: Koszt wykonawczych -Python.

Proponuję złapać rzeczy, które nie powinno się zdarzyć ani dzieje się rzadko (prawdziwe wyjątki) próbą z wyjątkiem i bardziej powszechnymi sytuacjami z warunkami. Zwłaszcza w przypadku jak Model.objects.get(), gdzie podstawowy SQL zwraca pustą listę, która nie podniosłaby wyjątku, jeśli zostanie wywołany jako filtr.

users = User.objects.filter(user=id)[:1]
user = users and users[0]
1
Community 23 maj 2017, 10:25