2009-03-12 11 views
63

simplement vérifier si un objet existe et retourner l'objet. puis en fonction de cela effectuer des actions. Je me demande quelle est la bonne façon de le faire sans retourner un 404?quelle est la bonne façon de valider si un objet existe dans une vue django sans retourner 404?

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

if listing: 
+0

Rasiel, puis-je vous suggérer d'accepter l'autre réponse? Cela semble être la bonne façon de le faire, et a été mis à jour un peu plus que la réponse acceptée. – Azendale

+0

Je peux le considérer, mais existe a été introduit dans Django 1.2 qui a été publié le 17 mai 2010, Si vous remarquez que ma question a été soumise en 09 ... c'était la bonne réponse à l'époque. Si Exists() est maintenant considéré comme le meilleur moyen de le faire, je suppose qu'il serait sémantiquement correct de choisir la deuxième réponse, non? – Rasiel

+0

Rasiel, il est logique que c'était la bonne réponse à ce moment-là. Mais les sites de stackoverflow semblent être autant de construire un ensemble de bonnes/questions officielles avec les meilleures réponses que les sites trouvent des solutions aux problèmes des gens. D'où ma suggestion de choisir ce qui est maintenant la réponse «officiellement correcte». – Azendale

Répondre

86

Je ne voudrais pas utiliser l'emballage 404 si vous n'êtes pas donné une 404. est une mauvaise utilisation de l'intention. Juste attraper le DoesNotExist, à la place.

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

+1: J'utiliserais cela à la place de 404 wrapper aussi. – Tiago

+0

+1: Oui, c'est une meilleure solution que celle acceptée, si vous ne voulez pas le 404. –

+0

yap, cela semble être la meilleure solution – Rasiel

141

Vous pouvez également faire

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

Parfois, il est plus clair d'utiliser essayer: sauf: bloc et d'autres fois un revêtement existe() rend le code plus clair à la recherche ... tout dépend de votre logique d'application.

+6

.exists() est plus rapide: https: //docs.djangoproject .com/fr/dev/ref/models/querysets/# existe – fjsj

+5

c'est le meilleur moyen et devrait avoir la réponse – Jharwood

+0

J'aime ça plus que l'essayer/sauf aussi – robbyt

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

C'est la meilleure solution si vous avez besoin d'utiliser l'objet potentiel plus tard, car il ne nécessite qu'une seule affectation, ce qui évite d'utiliser un bloc try/except. Notez que vous pouvez tester l'existence plus tard simplement avec 'if listing:' –

Questions connexes