我应该从哪里导入Django 1.10中的`DoesNotExist`异常?

时间:2018-09-22 10:37:07

标签: django python-3.x exception

我很难弄清楚这一点。我正在尝试捕获一个不存在的特定对象的异常,但是该行

foreach($a as $key => $value){
    if(array_key_exists($key, $b) && $value != $b[$key]){
        $a[$key] = $b[$key];
    } else{
        $a[$key] = 0;
    }
}

if($diff = array_diff_key($b, $a)){
    foreach($diff as $key => $value){
        $a[$key] = $value;
    }
}

ksort($a);
print_r($a);

给我from django.core.exceptions import DoesNotExist 警告。如果该文件中未指定例外,我在哪里可以找到它?

2 个答案:

答案 0 :(得分:2)

应为ObjectDoesNotExist

from django.core.exceptions import ObjectDoesNotExist

您还可以捕获特定模型的异常,如下所示:

from .your_models import ModelClass

ModelClass.DoesNotExist

答案 1 :(得分:2)

如果模型未知,则该异常称为ObjectDoesNotExists [Django-doc],因此可以将其导入为:

from django.core.exceptions import ObjectDoesNotExist

Object用于避免与每个模型都具有的DoesNotExist异常混淆(您可以将Object视为所有模型的对象的“概括”)。

但是请注意,如果您知道所查询模型的模型是什么,则最好使用更严格的异常,例如:

try:
    SomeModel.objects.get(pk=14)
except SomeModel.DoesNotExist:
    # ... do something
    pass

类似于model attributes [Django-doc]文档中指定的内容:

  

Django提供 DoesNotExist异常作为每个模型类的属性,以标识找不到的对象类并允许您捕获特定的模型类和try / except。例外是django.core.exceptions.ObjectDoesNotExist的子类。

由于无法获取某些(相关)模型,因此您(偶然)不捕获异常。通常,try-except块的跨度应尽可能小,并且异常应尽可能“显式”。