Django:"DoesNotExist"来自哪里?

oro*_*aki 39 django django-models

在Django的所有时间我都看到DoesNotExist像是在一起被提升db.models.fields.related.py.没有ObjectDoesNotExist定义django.core.exceptions,但只是DoesNotExist.这个异常类在哪里定义,或者我不完全理解异常?我已经检查过它不是例外(至少不是我所知道的).我很困惑.

注意:它也是免费的,作为模型子类实例的属性,如`self.someforeignkey.DoesNotExist.这怎么可能?

Ale*_*lli 56

DoesNotExist记录在这里:

DoesNotExist异常继承自django.core.exceptions.ObjectDoesNotExist,因此您可以定位多个DoesNotExist异常.

因此,您可以很好地使用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,), {}))
Run Code Online (Sandbox Code Playgroud)

  • 我认为,几乎在所有情况下,知道引发了哪个异常会好100%.毯子`除了ObjectDoesNotExist:`并不比`except:`更好.由于您不知道导致异常的原因,您的程序可能会对不良信息起作用. (4认同)
  • 谢谢亚历克斯。我不知道 Django 有 add_to_class() 方法。我在 Komodo 中搜索了“classDoesNotExist”的文档,结果我的头撞在墙上。 (2认同)

sha*_*nyu 7

DoesNotExist就像MultipleObjectsReturned,是模型类的属性.在生成模型时将其添加到模型中.

编辑:负责此过程的元类是ModelBase(django.db.models.base),您可以查看它以查看发生了什么.