Django 休息框架 - 如何防止 1062,"Duplicate entry"



在我的Django应用程序(仅限DRF(中,我试图创建一个新对象,其中一个字段设置如下:

resource_name = models.CharField(verbose_name="Resource Name", blank=False, null=False, max_length=50, unique=True)

如果我现在尝试用相同的resource_name创建一个Object两次,我总是会遇到以下异常:

django.db.utils.IntegrityError:(1062,"重复条目关键字"resource_name"的"test_ressosource123"(

有什么好的解决方案可以应用于所有这些情况吗?如果简单地让API响应对象已经存在,那就太棒了,有点奇怪,这还不是DRF的内置。我可以重写序列化程序的def-create函数调用吗?欢迎任何好的建议。

最好将UniqueValidator添加到序列化程序中。

resource_name = serializers.CharField(max_length=50, validators=[UniqueValidator(queryset=YourModel.objects.all())], requierd=False) 

通常,您应该为每个模型开发一个序列化程序,以了解如何使用每个模型。以后你可以忘记这个";普通的";解决方案,并长时间查找错误。

尽管如此,我还是看到了两种实现这种行为的方法。

覆盖ModelViewSet

我们可以重新定义默认ModelViewSetcreate方法,然后从这个类继承您的ModelViewSets。像这样:

from django.db import IntegrityError
from rest_framework import viewsets
from rest_framework.exceptions import APIException
from rest_framework.status import HTTP_400_BAD_REQUEST
class SupressIntegrityErrorModelViewSet(viewsets.ModelViewSet):
def create(self, request, *args, **kwargs):
try:
return super().create(request, *args, **kwargs)
except IntegrityError as e:
raise APIException(detail=str(e), code=HTTP_400_BAD_REQUEST)

点击此处了解更多信息。

DRF自定义异常处理

首先,您需要制作一个custom_exception_handler方法;DRF文档建议使用<application-directory>/utils.py:

from django.http import HttpResponseBadRequest
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
if type(exc).__name__ == 'IntegrityError':
return HttpResponseBadRequest(str(e))
return exception_handler(exc, context)

然后您必须在settings.py:中设置EXCEPTION_HANDLER

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

相关内容

最新更新