2010-01-26 8 views
38

Tout le temps dans Django je vois DoesNotExist étant soulevé comme dans db.models.fields.related.py. Pas ObjectDoesNotExist qui est défini dans django.core.exceptions, mais juste DoesNotExist. Où cette classe d'exception est-elle définie ou est-ce que je ne comprends pas complètement les exceptions? J'ai vérifié que ce n'est pas dans les exceptions (du moins pas que je sache). Je suis confus évidemment.Django: D'où vient "DoesNotExist"?

Remarque: Il est également disponible gratuitement, en tant qu'attribut d'une instance de sous-classe de modèle, comme `self.someforeignkey.DoesNotExist. Comment est-ce possible?

Répondre

54

DoesNotExist est documenté here:

L'exception DoesNotExist hérite de django.core.exceptions.ObjectDoesNotExist, afin que vous puissiez cibler plusieurs exceptions DoesNotExist.

afin que vous puissiez parfaitement utiliser except ObjectDoesNotExist: et attraper tous les DoesNotExist spécifiques au modèle des exceptions qui pourraient être soulevées dans la clause try, ou utilisez except SomeSpecificModel.DoesNotExist: lorsque vous voulez être plus précis.

Si vous cherchez l'endroit précis dans le code source de Django où cet attribut est ajouté au modèle des classes, voir here, 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,), {})) 
+0

Merci Alex. Je ne savais pas que Django avait cette méthode add_to_class(). J'ai fait une recherche documentaire à Komodo pour la 'classe DoesNotExist' et je me suis cogné la tête contre le mur. – orokusaki

+0

À moins qu'il soit nécessaire de désambiguïser quelle classe est la source de 'DoesNotExist' (très rare dans mon expérience), il est plus sûr d'utiliser' ObjectDoesNotExist'. – Marcin

+3

Je pense que dans presque toutes les situations, il est 100% préférable de savoir quelle exception a été soulevée. Une couverture 'excepté ObjectDoesNotExist:' n'est pas meilleure que 'excepté:'. Puisque vous ne savez pas ce qui a causé l'exception, votre programme agira potentiellement sur de mauvaises informations. – orokusaki

7

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 regarder pour voir ce qui se passe.