2009-03-12 13 views
63

im Grunde nur überprüfen, ob ein Objekt existiert und das Objekt zurückgeben. dann basierend darauf Aktionen durchführen. Ich frage mich, was ist der richtige Weg, es ohne 404 zu tun?Was ist der richtige Weg, um zu validieren, ob ein Objekt in einer Django-Ansicht existiert, ohne 404 zurückzugeben?

try: 
    listing = RealEstateListing.objects.get(slug_url = slug) 
except: 
    listing = None 

if listing: 
+0

Rasiel, kann ich vorschlagen, dass Sie in Betracht ziehen, die andere Antwort zu akzeptieren? Es scheint der richtige Weg zu sein, um dies zu tun, und wurde ein wenig mehr aufgewertet als die angenommene Antwort. – Azendale

+0

Ich kann es betrachten, aber es wurde in Django 1.2 eingeführt, das am 17. Mai 2010 veröffentlicht wurde, Wenn Sie bemerken, dass meine Frage in 09 eingereicht wurde ... das war die richtige Antwort zu der Zeit. Wenn Exists() jetzt als der beste Weg angesehen wird, um es zu tun, denke ich, es wäre semantisch korrekt, die zweite Antwort zu wählen, richtig? – Rasiel

+0

Rasiel, es macht Sinn, dass das die richtige Antwort zu der Zeit war. Aber die Stackoverflow-Sites scheinen genauso gut mit dem Aufbau einer Reihe guter/offizieller Fragen mit den besten Antworten zu beginnen, da die Sites Lösungen für die Probleme der Leute finden. Daher mein Vorschlag, auszuwählen, was jetzt die "offiziell richtige" Antwort ist. – Azendale

Antwort

86

Ich würde den 404-Wrapper nicht verwenden, wenn Sie keinen 404 erhalten. Das ist Zweckmissbrauch. Fangen Sie stattdessen nur DoesNotExist ab.

try: 
    listing = RealEstateListing.objects.get(slug_url=slug) 
except RealEstateListing.DoesNotExist: 
    listing = None 
+0

+1: Ich würde dies anstelle von 404 Wrapper auch verwenden. – Tiago

+0

+1: Ja, das ist eine bessere Lösung als die akzeptierte, wenn Sie nicht wollen, dass die 404. –

+0

Yap, dies scheint die bessere Lösung – Rasiel

141

Sie können auch

if not RealEstateListing.objects.filter(slug_url=slug).exists(): 
    do stuff... 

tun manchmal mehr ist es klar, versuchen zu nutzen: mit Ausnahme von: Block und andere Zeiten Einzeiler exists() macht den Code klarer suchen ... alles hängt von Ihrem Anwendungslogik.

+6

.exists() ist schneller: https: //docs.djangoproject .com/de/dev/ref/models/queriesets/# exists – fjsj

+5

das ist der bessere weg und sollte die antwort haben – Jharwood

+0

Ich mag das mehr als die try/exception auch – robbyt

2
listing = RealEstateListing.objects.filter(slug_url=slug).first() 
+0

Dies ist die beste Lösung, wenn Sie das potenzielle Objekt später verwenden müssen, da es nur eine Zuweisung erfordert und Sie vermeiden, einen try/except-Block zu verwenden. Beachten Sie, dass Sie später einfach mit 'if listing:' auf Existenz prüfen können –