Django: Where does "DoesNotExist" come from?

django, django-models, python-3.x

Solution

`DoesNotExist` is documented here:

The DoesNotExist exception inherits from django.core.exceptions.ObjectDoesNotExist, so you can target multiple DoesNotExist exceptions.

so you can perfectly well use `except ObjectDoesNotExist:` and catch all the model-specific `DoesNotExist` exceptions that might be raised in the `try` clause, or use `except SomeSpecificModel.DoesNotExist:` when you want to be more specific.

If you're looking for the specific spot in Django's source code where this attribute is added to model classes, see here, lines 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,), {}))

Problem

All the time in Django I see `DoesNotExist` being raised like in `db.models.fields.related.py`. Not `ObjectDoesNotExist` which is defined in `django.core.exceptions`, but just `DoesNotExist`. Where is this exception class defined, or am I not fully understanding exceptions? I've checked that it's not in exceptions (at least not that I know of). I'm confused obviously. Note: It also comes free, as an attribute of a model sub-class instance, like `self.someforeignkey.DoesNotExist. How is this possible?

Original source