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

Posted

技术标签:

【中文标题】如何在 Django rest 框架中捕获 Model.DoesNotExist 异常?【英文标题】:How to capture the Model.DoesNotExist exception in Django rest framework? 【发布时间】:2019-03-05 15:26:15 【问题描述】:

在 Django REST Framework 中,当您查询数据库模型并且它不存在时,将引发异常ModelName.DoesNotExist

此异常会根据型号名称而变化。

例如:

查询Car 模型将引发Car.DoesNotExist 查询Plane 模型将引发Plane.DoesNotExist

这会带来麻烦,因为您无法在一个共同的地方捕获异常,因为您不知道异常的父类。

每次查询不同的模型时都必须捕获不同的异常,例如:

try:
    return Car.objects.get(pk=1)
except Car.DoesNotExist:
    raise Http404

为什么要这样设计这个功能?

是否可以捕获一个常见的异常?

【问题讨论】:

【参考方案1】:

你可以使用ObjectDoesNotExist:

from django.core.exceptions import ObjectDoesNotExist

try:
    return Car.objects.get(pk=1)
except ObjectDoesNotExist:
    raise Http404

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

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

【讨论】:

谢谢,但为什么 django 已经有 ObjectDoesNotExist 时提供了详细的异常 @KramerLi Django 提供了一个 DoesNotExist 异常作为每个模型类的属性,以识别找不到的对象类,并允许您使用 try/except 捕获特定的模型类。跨度> @KramerLi 来自文档的这一部分:docs.djangoproject.com/en/2.1/ref/models/instances/…

以上是关于如何在 Django rest 框架中捕获 Model.DoesNotExist 异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中访问获取请求数据

如何在 Django REST 框架中使用事务?

如何在 django rest 框架中添加自定义权限和角色

如何在 django rest 框架中定义列表字段?

如何在 Django REST 框架中更改字段名称

如何在 django REST 框架中修改 request.data