如何在 django rest 框架中捕获数据库错误?

Ale*_*exH 5 django django-rest-framework

我对数据库字段有唯一的约束。当提交重复时,我想避免发送 500 响应。如何在 DRF 中捕获此错误并返回 4XX 响应?

Ale*_*exH 5

我知道我需要在某些地方放置一个 try/ except 块,但我不知道是什么。我查看了 DRF 代码,发现 generics.ListCreateAPIView 有一个名为create的方法。我在我的类中编写了一个名为父create的新函数,它与我继承的函数(名为create )具有相同的签名,并且我将 try/ except 放在该函数周围。

最后看起来像这样:

class MyModelList(generics.ListCreateAPIView):
    def get_queryset(self):
        return MyModel.objects.all()
    def create(self, request, *args, **kwargs):
        try:
            return super(MyModelList, self).create(request, *args, **kwargs)
        except IntegrityError:
            raise CustomUniqueException
    serializer_class = MyModelSerializer
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人。


Car*_*cho 5

如果您只想将此视图覆盖handle_exception

class MyAPIView(APIView):
  ...

  def handle_exception(self, exc):
      """
      Handle any exception that occurs, by returning an appropriate
      response,or re-raising the error.
      """
      ...
Run Code Online (Sandbox Code Playgroud)

要处理所有视图,您可以定义一个全局异常处理程序,请参见此处: http: //www.django-rest-framework.org/api-guide/exceptions