Muszę sprawdzić, czy obiekt istnieje i zwrócić obiekt, a następnie na podstawie tego wykonać akcje. Jaki jest właściwy sposób, aby to zrobić bez zwracania kodu 404?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
django
django-views
Rasiel
źródło
źródło
if listing:
Powinno byćelse:
.Odpowiedzi:
Nie użyłbym opakowania 404, gdybyś nie otrzymał 404. To jest nadużycie intencji. Zamiast tego po prostu złap DoesNotExist.
try: listing = RealEstateListing.objects.get(slug_url=slug) except RealEstateListing.DoesNotExist: listing = None
źródło
exists()
gdybyś musiał coś zrobić z obiektem.values_list('id', flat=True)
. jeśli muszę tylko sprawdzić, czy istniejelisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
to odwoływanie się do modelu, a nie do samego obiektu. Dlaczego tak nie jestRealEstateListing.objects.get(slug_url=slug).DoesNotExist
?Możesz też:
if not RealEstateListing.objects.filter(slug_url=slug).exists(): # do stuff...
Czasami bardziej oczywiste jest użycie
try: except:
bloku, a innym razem jednolinijkaexists()
sprawia, że kod wygląda jaśniej ... wszystko zależy od logiki aplikacji.źródło
exists()
to nie działaget()
, prawda?get()
później, wyśle drugie zapytanie do bazy danych.try-except
ponadexists()
.listing = RealEstateListing.objects.filter(slug_url=slug).first()
źródło
if listing:
.exists()
. Myślę, że dobrym pomysłem w SO jest posiadanie wielu różnych odpowiedzi, jak robić różne rzeczy. Może to jest lepsze dla tych, którzy również chcą użyć obiektu, jeśli istnieje. Nie ustalałbym żadnych zasad, jeśli należy unikać prób / wyjątków, czy nie. Czasami jest to dobre, a czasami złe, na przykład, jeśli chcesz stworzyć bardzo kompaktowy kod.Zrobiłbym to w następujący sposób:
listing = RealEstateListing.objects.filter(slug_url=slug) if listing: # do stuff
Nie widzę potrzeby próbowania / łapania. Jeśli w wyniku jest potencjalnie kilka obiektów, użyj metody first (), jak pokazuje użytkownik Henrik Heino
źródło