2010-01-26 18 views
38

Todo el tiempo en Django veo DoesNotExist que se plantea como en db.models.fields.related.py. No ObjectDoesNotExist que se define en django.core.exceptions, pero solo DoesNotExist. ¿Dónde se define esta clase de excepción, o no estoy comprendiendo completamente las excepciones? He comprobado que no está en excepciones (al menos no que yo sepa). Estoy confundido, obviamente.Django: ¿De dónde viene "DoesNotExist"?

Nota: También viene gratis, como un atributo de una instancia de subclase modelo, como `self.someforeignkey.DoesNotExist. ¿Cómo es esto posible?

Respuesta

54

DoesNotExist se documenta here:

La excepción DoesNotExist hereda de django.core.exceptions.ObjectDoesNotExist, para que pueda orientar múltiples excepciones DoesNotExist.

por lo que puede perfectamente utilizar except ObjectDoesNotExist: y coger todos los DoesNotExist excepciones específicas del modelo que pudieran suscitarse en la cláusula try, o utilizar except SomeSpecificModel.DoesNotExist: cuando se desea ser más específico.

Si usted está buscando el lugar específico en el código fuente de Django, donde se añade este atributo para modelar clases, consulte here, líneas 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

Gracias Alex. No sabía que Django tenía ese método add_to_class(). Hice una búsqueda de documentos en Komodo para la 'clase DoesNotExist' y me estaba golpeando la cabeza contra la pared. – orokusaki

+0

A menos que sea necesario desambiguar qué clase es la fuente de 'DoesNotExist' (muy raro en mi experiencia), es más seguro para el usuario' ObjectDoesNotExist'. – Marcin

+3

Creo que en casi todas las situaciones es 100% mejor saber qué excepción se planteó. Una manta 'excepto ObjectDoesNotExist:' no es mejor que 'excepto:'. Como no sabe qué causó la excepción, su programa posiblemente estará actuando con mala información. – orokusaki

7

DoesNotExist, al igual que MultipleObjectsReturned, es un atributo de una clase de modelo. Se agrega al modelo cuando se genera el modelo.

EDITAR: La metaclase responsable de este proceso es ModelBase (django.db.models.base) y puede verla para ver qué está sucediendo.

Cuestiones relacionadas