2010-01-26 17 views
38

Die ganze Zeit in Django sehe ich DoesNotExist wie in db.models.fields.related.py angehoben werden. Nicht ObjectDoesNotExist, die in django.core.exceptions definiert ist, aber nur DoesNotExist. Wo ist diese Ausnahmeklasse definiert oder verstehe ich Ausnahmen nicht vollständig? Ich habe überprüft, dass es nicht in Ausnahmen (zumindest nicht, dass ich weiß). Ich bin offensichtlich verwirrt.Django: Woher kommt "DoesNotExist"?

Hinweis: Es wird auch als Attribut einer Modellunterklasseninstanz wie `self.someforeignkey.DoesNotExist 'bereitgestellt. Wie ist das möglich?

Antwort

54

DoesNotExisthere dokumentiert ist:

Die doesNotExist Ausnahme erbt von django.core.exceptions.ObjectDoesNotExist, so können Sie mehrere doesNotExist Ausnahmen zielen.

so können Sie sehr gut except ObjectDoesNotExist: verwenden und alle modellspezifischen DoesNotExist Ausnahmen abfangen, die in der try Klausel erhoben werden könnten, oder except SomeSpecificModel.DoesNotExist: verwenden, wenn Sie präziser sein wollen.

Wenn Sie sich für die spezifische Stelle in Djangos Quellcode, in dem dieses Attribut hinzugefügt, um Klassen zu modellieren, sehen here, Zeilen 34-37 suchen:

# 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

Dank Alex. Ich wusste nicht, dass Django diese Methode add_to_class() hatte. Ich habe in Komodo eine Dokumentensuche nach "class DoesNotExist" gemacht und schlug mir den Kopf an die Wand. – orokusaki

+0

Wenn es nicht notwendig ist, zu disambiguieren, welche Klasse die Quelle von 'DoesNotExist' ist (sehr selten in meiner Erfahrung), ist es sicherer den Benutzer' ObjectDoesNotExist' zu benutzen. – Marcin

+3

Ich denke, dass es in fast jeder Situation 100% besser ist zu wissen, welche Ausnahme ausgelöst wurde. Eine Decke 'außer ObjectDoesNotExist:' ist nicht besser als 'außer:'. Da Sie nicht wissen, was die Ausnahme verursacht hat, wird Ihr Programm möglicherweise auf schlechte Informationen reagieren. – orokusaki

7

DoesNotExist, genau wie MultipleObjectsReturned, ist ein Attribut für eine Modellklasse. Es wird dem Modell hinzugefügt, wenn das Modell generiert wird.

EDIT: Die Metaklasse für diesen Prozess verantwortlich ist ModelBase (django.db.models.base) und Sie können es anschauen, um zu sehen, was vor sich geht.