2009-03-12 3 views
63

fondamentalmente basta verificare se esiste un oggetto e restituire l'oggetto. quindi basato su quello che esegue le azioni. Mi sto chiedendo qual è il modo giusto per farlo senza restituire un 404?qual è il modo giusto per convalidare se un oggetto esiste in una vista django senza restituire 404?

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

if listing: 
+0

Rasiel, posso suggerire di prendere in considerazione l'accettazione dell'altra risposta? Sembra essere il modo corretto per farlo, ed è stato svalutato un bel po 'più della risposta accettata. – Azendale

+0

Posso considerarlo, comunque esiste è stato introdotto in Django 1.2 che è stato rilasciato il 17 maggio 2010, se si nota la mia domanda è stata presentata nel 09 ... questa era la risposta corretta al momento. Se Exists() è ora considerato il modo migliore per farlo, suppongo che sarebbe semanticamente corretto scegliere la seconda risposta, giusto? – Rasiel

+0

Rasiel, ha senso che quella era la risposta corretta al momento. Ma i siti di stackoverflow sembrano essere tanto sulla costruzione di una serie di domande buone/ufficiali con le risposte migliori quanto i siti stanno trovando soluzioni ai problemi delle persone. Da qui il mio suggerimento di selezionare quella che ora è la risposta "ufficialmente corretta". – Azendale

risposta

86

Non utilizzerei il wrapper 404 se non viene fornito un 404. Questo è un uso improprio dell'intenzione. Basta prendere DoesNotExist, invece.

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

+1: userei questo invece del wrapper 404. – Tiago

+0

+1: Sì, questa è una soluzione migliore rispetto a quella accettata, se non si desidera il 404. –

+0

yap, questa sembra essere la soluzione migliore – Rasiel

141

Si può anche fare

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

A volte è più chiaro da usare try: ad eccezione di: blocco e altre volte esiste one-liner() rende il codice più chiaro guardando ... tutto dipende dal vostro logica applicativa.

+6

.exists() è più veloce: https: //docs.djangoproject .com/it/dev/ref/models/querysets/# esiste – fjsj

+5

questo è il modo migliore e dovrebbe avere la risposta – Jharwood

+0

Mi piace questo più che il try/tranne troppo – robbyt

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

Questa è la soluzione migliore se è necessario utilizzare l'oggetto potenziale in un secondo momento, poiché richiede solo un'assegnazione ed evita di dover utilizzare un blocco try/except. Nota che puoi testare per l'esistenza in seguito semplicemente con 'if listing:' –

Problemi correlati