如何为Django REST的DeleteLedgerCategory视图添加自定义验证错误信息
解决DRF中删除默认分类时的规范错误提示问题
你这里有两个关键需要修正的地方,一个是方法名的拼写错误,另一个是用DRF规范的异常替代普通ValueError,这样返回的错误响应才符合REST API标准:
步骤1:导入DRF专属的验证异常
首先需要引入DRF专门提供的ValidationError,它会被框架自动处理成标准的JSON错误响应:
from rest_framework.exceptions import ValidationError
步骤2:修正方法名并替换异常类型
注意你的代码里方法名写错了——是perform_destroy而不是preform_destroy,这个拼写错误会导致这个方法根本不会被DRF调用!然后把ValueError换成ValidationError,可以自定义清晰的错误信息:
class DeleteLedgerCategory(DestroyAPIView): serializer_class = CategorySerializer permission_classes = [IsAuthenticated] def get_queryset(self): queryset = Category.objects.filter(company = self.request.user.currently_activated_company, id=self.kwargs['pk']) return queryset def perform_destroy(self, instance): if instance.is_default: # 用DRF的ValidationError替代ValueError,返回标准错误响应 raise ValidationError(detail="Cannot delete default system category", code="cannot_delete_default_category") return instance.delete()
为什么这么改?
- 普通的
ValueError会触发DRF的500服务器错误响应,这对API客户端不友好,也不符合REST规范; - DRF的
ValidationError会被框架捕获,自动返回400 Bad Request状态码,响应体是标准的JSON格式:{ "detail": "Cannot delete default system category" } - 你还可以通过
code参数自定义错误码,方便客户端做针对性的错误处理。
内容的提问来源于stack exchange,提问作者Suman Astani
相关产品推荐
相关产品推荐

