Django:Where's';“实干家”;来自
在Django的所有时间里,我都看到Django:Where's';“实干家”;来自,django,django-models,Django,Django Models,在Django的所有时间里,我都看到DoesNotExist像在db.models.fields.related.py中一样被提出。不是django.core.exceptions中定义的ObjectDoesNotExist,而是DoesNotExist。这个异常类是在哪里定义的,还是我没有完全理解异常?我已经检查过它没有例外(至少据我所知没有)。我显然很困惑 注意:它也是免费的,作为模型子类实例的属性,如'self.someforeignkey.DoesNotExist'。这怎么可能呢?Doe
DoesNotExist
像在db.models.fields.related.py中一样被提出。不是django.core.exceptions
中定义的ObjectDoesNotExist
,而是DoesNotExist
。这个异常类是在哪里定义的,还是我没有完全理解异常?我已经检查过它没有例外(至少据我所知没有)。我显然很困惑
注意:它也是免费的,作为模型子类实例的属性,如'self.someforeignkey.DoesNotExist'。这怎么可能呢?DoesNotExist
,就像MultipleObjectsReturned
,是模型类上的一个属性。生成模型时,会将其添加到模型中
编辑:负责此过程的元类是ModelBase
(django.db.models.base
),您可以查看它以了解发生了什么。DoesNotExist
记录如下:
DoesNotExist异常继承
从…起
django.core.exceptions.ObjectDoesNotExist,
所以你可以瞄准多个目标
DoesNotExist例外
因此,您可以很好地使用except ObjectDoesNotExist:
并捕获可能在try
子句中引发的所有特定于模型的DoesNotExist
异常,或者在希望更具体时使用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,), {}))
谢谢你,亚历克斯。我不知道Django有那个add_to_class()方法。我在科莫多做了一个文档搜索,寻找“类DoesNotExist”,我的头撞到了墙上。除非有必要澄清哪个类是DoesNotExist
的来源(在我的经验中非常罕见),用户ObjectDoesNotExist
更安全。我认为,在几乎所有情况下,最好知道引发了哪个异常。除了ObjectDoesNotExist:
之外的一个总括并不比除了:
好多少。因为您不知道是什么导致了异常,所以您的程序可能会根据错误信息执行操作。