39 votes

Django: D'où vient "DoesNotExist"?

Tout le temps dans Django je vois DoesNotExist être soulevées comme en db.models.fields.related.py. Pas ObjectDoesNotExist , qui est définie en django.core.exceptions, mais seulement DoesNotExist. Où est cette classe d'exception définie, ou je ne suis pas entièrement comprendre les exceptions? J'ai vérifié qu'il n'est pas dans les exceptions (au moins pas que je sache). Je suis confus de toute évidence.

Remarque: Il est également livré gratuitement, comme un attribut d'un modèle sous-classe de l'instance, à l'instar de " l'auto.someforeignkey.DoesNotExist. Comment est-ce possible?

56voto

Alex Martelli Points 330805

DoesNotExist est documenté ici:

Le DoesNotExist exception hérite à partir de django.de base.des exceptions.ObjectDoesNotExist, de sorte que vous pouvez cibler plusieurs DoesNotExist exceptions.

ainsi, vous pouvez parfaitement utiliser except ObjectDoesNotExist: et attraper tous les spécifiques au modèle, DoesNotExist des exceptions qui peuvent être soulevées dans l' try clause, ou utiliser except SomeSpecificModel.DoesNotExist: quand vous voulez être plus précis.

Si vous êtes à la recherche de l'endroit spécifique dans Django le code source d'où cet attribut est ajouté à des classes de modèle, voir ici, les lignes 34-37:

# Create the class.
new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})
new_class.add_to_class('_meta', Options(attrs.pop('Meta', None)))
new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))

7voto

shanyu Points 4775

DoesNotExist , tout comme MultipleObjectsReturned , est un attribut d'une classe de modèle. Il est ajouté au modèle lorsque le modèle est généré.

EDIT: La métaclasse responsable de ce processus est ModelBase ( django.db.models.base ) et vous pouvez la consulter pour voir ce qui se passe.

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