Je dois vérifier si un objet existe et retourner l'objet, puis en fonction de cela, effectuer des actions. Quelle est la bonne façon de le faire sans retourner une 404?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
django
django-views
Rasiel
la source
la source
if listing:
devrait être unelse:
.Réponses:
Je n'utiliserais pas le wrapper 404 si vous ne recevez pas un 404. C'est un abus d'intention. Attrapez simplement DoesNotExist, à la place.
la source
exists()
si vous devez faire quelque chose avec l'objet.values_list('id', flat=True)
. si j'ai juste besoin de voir s'il existelisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
fait référence au modèle et non à l'objet lui-même. Pourquoi nonRealEstateListing.objects.get(slug_url=slug).DoesNotExist
?Vous pouvez également faire:
Parfois, il est plus clair d'utiliser le
try: except:
bloc et d'autres fois, une seule ligneexists()
rend le code plus clair ... tout dépend de la logique de votre application.la source
exists()
cela ne fonctionne pas avecget()
, non?get()
plus tard, il enverra une deuxième requête à la base de données.try-except
àexists()
.la source
if listing:
.exists()
. Je pense que c'est une bonne idée en SO d'avoir plusieurs réponses différentes sur la façon de faire les choses. C'est peut-être mieux pour ceux qui souhaitent également utiliser l'objet s'il existe. Je ne ferais aucune règle si essayer / sauf doit être évité ou non. Parfois c'est bon, et parfois c'est mauvais par exemple si vous voulez juste faire du code très compact.Je le ferais aussi simplement comme suit:
Je ne vois pas la nécessité d'essayer / attraper. S'il y a potentiellement plusieurs objets dans le résultat, utilisez first () comme indiqué par l'utilisateur Henrik Heino
la source