如何在 Django rest 框架中捕获 Model.DoesNotExist 异常?

Kra*_* Li 10 django django-models django-rest-framework

在 Django 休息框架中。当您查询数据库模型并且它不存在时,您将遇到如下异常

ModleName.DoesNotExist
Run Code Online (Sandbox Code Playgroud)

此异常将根据模型名称而变化。例如:

查询模型 Car 会提出

Car.DoesNotExist
Run Code Online (Sandbox Code Playgroud)

查询模型平面会升起

Plane.DoesNotExist
Run Code Online (Sandbox Code Playgroud)

这会导致您无法在一个常见的地方捕获异常的麻烦。因为你不知道 Exception 的父类。每次查询模型时都必须捕获异常,例如:

    try:
        return Car.objects.get(pk=1)
    except Car.DoesNotExist:
        raise Http404
Run Code Online (Sandbox Code Playgroud)

为什么 Django 设计这样的异常?是否可以通过其共同祖先捕获异常?

nev*_*ner 9

您可以使用ObjectDoesNotExist

from django.core.exceptions import ObjectDoesNotExist

try:
    return Car.objects.get(pk=1)
except ObjectDoesNotExist:
    raise Http404
Run Code Online (Sandbox Code Playgroud)

ObjectDoesNotExist将捕获DoesNotExist所有模型的异常。

Django 还提供了get_object_or_404()快捷方式,因此您无需显式提升 Http404。