http://docs.djangoproject.com/en/dev/ref/models/querysets/#id5
get() raises a DoesNotExist exception if an object wasn't found for the given parameters. This exception is also an attribute of the model class. Example: Entry.objects.get(id='foo') # raises Entry.DoesNotExist The DoesNotExist exception inherits from django.core.exceptions.ObjectDoesNotExist, so you can target multiple DoesNotExist exceptions.How does it actually work? The Stack Overflow thread has this discussion:
http://stackoverflow.com/questions/2143506/django-where-does-doesnotexist-come-from
If you dig through the django.db.models.base.py file, you see these lines:
class ModelBase(type): super_new = super(ModelBase, cls).__new__ new_class = super_new(cls, name, bases, {'__module__': module}) if not abstract: new_class.add_to_class('DoesNotExist', subclass_exception('DoesNotExist', ObjectDoesNotExist, module)) new_class.add_to_class('MultipleObjectsReturned', subclass_exception('MultipleObjectsReturned', MultipleObjectsReturned, module)) . . . def add_to_class(cls, name, value): if hasattr(value, 'contribute_to_class'): value.contribute_to_class(cls, name) else: setattr(cls, name, value)
You then have to wade through the bottom of the file to see what subclass_exception() actually does:
if sys.version_info < (2, 5): # Prior to Python 2.5, Exception was an old-style class def subclass_exception(name, parent, unused): return types.ClassType(name, (parent,), {}) else: def subclass_exception(name, parent, module): return type(name, (parent,), {'__module__': module})It seems that Django creates a DoesNotExist exception for the class itself dynamically. The parent object is ObjectDoesNotExist, so you can use that parent to be able to catch exceptions thrown by multiple classes.
No comments:
Post a Comment