自定义 serializers.ValidationError 的错误返回
在使用DRF进行反序列过程中,总是需要校验字段,然后返回错误结果。可以使用默认的自定义校验项,也可以自定义校验项。而默认的自定义校验项总是差强人意。
版本
Django 2.2.3
Python 3.8.8
djangorestframework 3.13.1
目标效果

默认错误返回效果 —— 默认校验函数

默认错误返回 —— 默认校验函数
def validate(self, attrs):
"""
验证字段
"""
# 确认手机号是否唯一
user = User.objects.get(mobile=attrs.get('mobile'))
print(user)
if user:
raise serializers.ValidationError(detail={'status': 1, 'message': '当前手机号码已经被注册!', 'data': None})
默认错误返回效果 —— 自定义校验函数

采用自定义校验函数之后,返回格式有所改善,但是此种返回都是以字段名为key,自定义的内容格式成为了这个key的value。
默认错误返回 —— 自定义校验函数
def validate_mobile(self, mobile):
"""
验证手机号
"""
try:
# 确认手机号是否唯一
user = User.objects.get(mobile=mobile)
print(user)
if user:
raise serializers.ValidationError(detail={'status': 1, 'message': '当前手机号码已经被注册!', 'data': None})
except User.DoesNotExist:
pass
return mobile
自定义校验函数说明
- 方法名必须以validate_作为前缀,后缀为对应的字段名:如
validate_mobile中的mobile即为模型的一个字段 - 一定要返回校验之后的值:
return mobile - 不需要放在validators的列表中就可以生效(暂未理解为何意)
避坑: 方法名前缀是validate_为前缀,而不是validated_为前缀。Pycharm提示时会出现 validated_xxx ,此时多了一个d
自定义ValidationError返回
# -*- coding:utf-8 -*-
# author: F0080
# Python 3.8.8
# FilePath: 项目/utils/validation_error.py,如demo/utils/validation_error.py
# FilePath可随意定义,但注意后面引入路径
from django.utils.translation import ugettext_lazy as u_
from rest_framework import status
from rest_framework.exceptions import APIException, ErrorDetail
from rest_framework.utils.serializer_helpers import ReturnList, ReturnDict
def get_error_details(data, default_code=None):
if isinstance(data, list):
ret = [
get_error_details(item, default_code) for item in data
]
if isinstance(data, ReturnList):
return ReturnList(ret, serializer=data.serializer)
return ret
elif isinstance(data, dict):
ret = {
key: get_error_details(value, default_code) for key, value in data.items()
}
print(ret)
if isinstance(data, ReturnDict):
return ReturnDict(ret, serializer=data.serializer)
return ret
code = getattr(data, 'code', default_code)
# 返回一个对象属性值
return ErrorDetail(data, code)
class ValidationError400(APIException):
status_code = status.HTTP_400_BAD_REQUEST
default_detail = u_('Invalid input.')
default_code = 'invalid'
def __init__(self, detail=None, code=None):
if detail is None:
detail = self.default_detail
if code is None:
code = self.default_code
if not isinstance(detail, dict) and not isinstance(detail, list):
detail = [detail]
self.detail = get_error_details(detail, code)
在serializers.py中使用自定义ValidationError
from demo.utils.validation_error.py import ValidationError400
...
def validate_mobile(self, mobile):
"""
自定义校验函数——验证手机号
"""
try:
# 确认手机号是否唯一
user = User.objects.get(mobile=mobile)
print(user)
if user:
raise ValidationError400(detail={'status': 1, 'message': '当前手机号码已经被注册!', 'data': None})
except User.DoesNotExist:
pass
return mobile
def validate(self, attrs):
"""
默认校验函数——验证密码
"""
password = attrs.get('password')
# 验证密码长度6-16位
if not re.match('^.{6,16}$', password):
raise ValidationError400(detail={'status': 1, 'message': '密码长度必须在6-16位之间!', 'data': None})
...
致谢大佬
rest_framework serializers ValidationError 错误信息自定义 key 值
DjangoRestFramework ModelSerializer:字段级验证不起作用
自定义 serializers.ValidationError 的错误返回的更多相关文章
- TCP connect的错误返回值
如果是TCP套接字,调用connect函数将激发TCP三次握手过程,而且仅在连接建立成功或出错时返回,其中错误返回可能有下面几种情况: (1)若TCP客户没有收到SYN分节的响应,则返回ETIMEDO ...
- Spring验证的错误返回------BindingResult
Spring验证的错误返回------BindingResult 参考资料:http://www.mkyong.com/spring-mvc/spring-mvc-form-errors-tag-ex ...
- phpcms v9自定义表单提交后返回上一页实现方法
PHPcms v9中提交自定义表单后默认都是回到首页的,是不是感觉很不爽! 接下来,就说下phpcms v9自定义表单提交后返回上一页实现方法. 1.找到这个文件 phpcms\modules\for ...
- Struts2自定义Field级别的错误提示信息
自定义Field级别的错误提示信息步骤: 在action包中新建一个以Action命名的properties文件,如:RegisterAction.properties 2. 然后在该属性文件中指定每 ...
- jQuery ajax请求错误返回status 0和错误error的问题
上周发现一个jQuery ajax请求错误返回status 0和错误error的问题,responseText是"error",状态码是0而不是200: $.ajax({ type ...
- 14、SpringBoot------定制错误返回内容json格式
开发工具:STS 前言: 在前后端分离的项目中,当前端向后端请求资源失败时,想知道具体的错误原因,给用户予以提示. 但是,在springboot中返回内容是固定的.并不适合我们前端进行分析. 所以,就 ...
- Laravel自定义错误提示,自定义异常类提示,自定义错误返回信息,自定义错误页面
方法一 新增CustomException.php文件 App\Exceptions\CustomException.php <?php namespace App\Exceptions; us ...
- 自定义 404 与 500 错误页面,URL 地址不会重定向(一)
对于 404 与 500 错误发生时,我们希望自己定义一个更加人性化的页面. 例子 当访问下面这个地址时: http://localhost/aaaa/bbb/ccc/ddd/eee/fff/ggg ...
- 解决spring boot中rest接口404,500等错误返回统一的json格式
在开发rest接口时,我们往往会定义统一的返回格式,列如: { "status": true, "code": 200, "message" ...
随机推荐
- 使用VScode编写Markdown的一些使用技巧
- ApacheCN JavaScript 译文集 20211122 更新
JavaScript 编程精解 中文第三版 零.前言 一.值,类型和运算符 二.程序结构 三.函数 四.数据结构:对象和数组 五.高阶函数 六.对象的秘密 七.项目:机器人 八.Bug 和错误 九.正 ...
- python程序语法元素分析
#TemConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in ['F', 'f']: C = (eval(Tem ...
- linnux命令 - brctl和ifconfig
1.安装brctl centos7.6安装使用 yum install bridge-utils ubuntu使用 apt-get install bridge-utils 什么是网桥 网桥是一种在链 ...
- java - HashMap原理及实现 (转)
众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry.这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干. HashMap ...
- Linux开机显示模式切换
修改vim /etc/inittab 默认为5-图形界面模式,改为3-多用户模式即可 # Default runlevel. The runlevels used are: # 0 - halt (D ...
- where子句和having子句区别
感谢大佬:https://blog.csdn.net/XiaopinOo/article/details/78305008 where子句和having子句的区别: 1.where 不能放在grou ...
- 代理模式应用-AOP事务(转)
https://jinnianshilongnian.iteye.com/blog/14872351.预备知识 aop概念请参考[http://www.iteye.com/topic/1122401] ...
- 索引,事务,存储引擎和选择,视图,mysql管理
一.mysql索引:提高数据库的性能(不用加内存,不用改程序,不用调sql,查询速度就可能提高百倍千倍)索引会占用磁盘空间 CREATE INDEX 索引名 ON 数据表 (列名or字 ...
- Eclipse、MyEclipse中代码提示框颜色
Matching breackets highlight = 匹配括号突出显示 Completion proposal background = 提示框背景色 Completion proposal ...