Подтвердить что ты не робот

Django: Откуда возникает "DoNotExist"?

Все время в Django я вижу DoesNotExist, как в db.models.fields.related.py. Не ObjectDoesNotExist, который определен в django.core.exceptions, а просто DoesNotExist. Где этот класс исключений определен, или я не полностью понимаю исключения? Я проверил, что это не в исключениях (по крайней мере, я не знаю). Я совершенно смущен.

Примечание. Он также становится бесплатным как атрибут экземпляра подкласса модели, например `self.someforeignkey.DoesNotExist. Как это возможно?

4b9b3361

Ответ 1

DoesNotExist документируется здесь:

Наследование исключений DoNotExist из django.core.exceptions.ObjectDoesNotExist, так что вы можете Исключения exceptNotExist.

чтобы вы могли отлично использовать except ObjectDoesNotExist: и улавливать все исключения DoesNotExist для модели, которые могут быть подняты в предложении try, или использовать except SomeSpecificModel.DoesNotExist:, когда вы хотите быть более конкретным.

Если вы ищете конкретное место в исходном коде Django, где этот атрибут добавлен в классы моделей, см. здесь, строки 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,), {}))

Ответ 2

DoesNotExist, как и MultipleObjectsReturned, является атрибутом в классе модели. Он добавляется к модели при создании модели.

EDIT: метакласс, отвечающий за этот процесс, ModelBase (django.db.models.base), и вы можете посмотреть его, чтобы увидеть, что происходит.