2016-12-01 65 views
6

Mam kilka pytań na temat django exists() i DoesNotExist.Django istnieje() kontra DoesNotExist

Przykład Kod:

id = 1 
# first 
if User.objects.get(pk=id).exists(): 
    # my logic 
    pass 
# second 
try: 
    User.objects.get(pk=id) 
    # my logic 
    pass 
except User.DoesNotExist: 
    return 0 

często korzystać get() metody. Która z praktyk jest lepsza? Który kod jest lepszy? Pierwszy czy drugi?

+1

Możliwa duplikat [. Co jest bardziej wydajny .objects.filter() istnieje() lub get() i spróbować] (http: // stackoverflow. com/questions/23562784/co-jest-bardziej-wydajne-obiekty-filtr-istnieje-lub-get-and-a-wypróbuj) – AKS

+0

'get (pk = id) .exists()' _doesn't work_. Jeśli nie istnieje, to get() rzuci wyjątek. exists() działa tylko w przypadku zapytań, funkcja get() zwraca instancję, a nie zestaw zapytań. – RemcoGerlich

+0

oh sorry exists() jest metodą queryset. dzięki –

Odpowiedz

4

jeśli User.objects.get (pk = id) .exists()

To nie zadziała, więc pytanie jest dość prosta odpowiedź: ta droga jest gorsza ze sposobów, które do pracy :-)

Zgaduję, że faktycznie nie zrobiłeś Minimal Complete Verifiable Example i dlatego przegapiłeś błąd, gdy opublikowałeś niezweryfikowany kod.


Zamiast więc, jak sądzę prosicie o różnicy między:

Różnica jest:

  • Sposób QuerySet.exists jest na queryset, czyli poprosić go o zapytaniu, a ty („istnieją wszelkie przypadki dopasowania tej kwerendy?”) "nie próbujemy jeszcze odzyskać konkretnej instancji.

  • DoesNotExist wyjątek dla modelu jest podniesione kiedy rzeczywiście próbował pobrać jedną instancję, i to nie istnieje.

Użyj tego, który poprawnie wyraża twój zamiar.

0

można znaleźć więcej informacji w docs: o exists(), ale exists() działa tylko dla queryset

Zwraca TRUE jeśli QuerySet zawiera żadnych wyników, a false jeśli nie. Próbuje wykonać zapytanie w najprostszy i najszybszy możliwy sposób, ale wykonuje prawie to samo zapytanie, co zwykłe zapytanie QuerySet.

exists() jest przydatna w przypadku wyszukiwań związanych zarówno z przynależnością do obiektu w QuerySet, jak i istnieniem dowolnych obiektów w QuerySet, szczególnie w kontekście dużego zestawu QuerySet.

Ale ObjectDoesNotExist działa tylko z get().

Ponadto można spróbować innego podejścia:

user = User.objects.filter(id=2) 
if user: 
    # put your logic 
    pass