107 votes

Quelle est la bonne façon de valider si un objet existe dans une vue django sans retourner 404 ?

J'ai besoin de vérifier si un objet existe et de renvoyer l'objet, puis sur cette base d'exécuter des actions. Quelle est la bonne façon de le faire sans retourner un 404 ?

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

if listing:

1 votes

Rasiel, puis-je te suggérer d'envisager d'accepter l'autre réponse ? Il semble que ce soit la bonne façon de procéder et elle a reçu beaucoup plus de votes positifs que la réponse acceptée.

1 votes

Je peux l'envisager, cependant exists 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 réponse correcte à l'époque. Si Exists() est maintenant considéré comme la meilleure façon de le faire, je suppose qu'il serait sémantiquement correct de choisir la deuxième réponse, non ?

0 votes

Rasiel, il est logique que ce soit la bonne réponse à l'époque. Mais les sites de stackoverflow semblent autant s'intéresser à la construction d'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 sélectionner ce qui est maintenant la réponse "officiellement correcte".

228voto

zzart Points 2162

Vous pouvez aussi le faire :

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

Parfois, il est plus clair d'utiliser try: except: bloc et d'autres fois une seule ligne exists() rend le code plus clair... tout dépend de la logique de votre application.

11 votes

8 votes

C'est la meilleure façon et devrait avoir la réponse

0 votes

J'aime mieux ça que la méthode "essayer/excepter".

128voto

ironfroggy Points 3496

Je n'utiliserais pas l'enveloppe 404 si on ne vous donne pas un 404. C'est un détournement de but. Attrapez simplement le DoesNotExist, à la place.

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

0 votes

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

0 votes

Yap, ceci semble être la meilleure solution

3 votes

Cette solution fonctionne mieux que exists() si vous devez faire quelque chose avec l'objet.

9voto

Henrik Heino Points 38
listing = RealEstateListing.objects.filter(slug_url=slug).first()

0voto

Greg Holst Points 480

Je le ferais de la manière la plus simple qui soit :

listing = RealEstateListing.objects.filter(slug_url=slug)
if listing:
    # do stuff

Je ne vois pas l'utilité de try/catch. S'il y a potentiellement plusieurs objets dans le résultat, alors utilisez first() comme le montre l'utilisateur Henrik Heino

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X