自定义 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" ...
随机推荐
- 计算机网络再次整理————tcp[二]
前言 本文不会去介绍tcp的具体协议,因为这个tcp 应该不能说是单纯的连接和传输数据这么简单,里面还有很多机制. 正文 首先介绍一下什么是协议族(protocal Family),举个例子PF_IN ...
- CSP2019 Day2T3 树的重心
显然如果我们直接枚举断哪条边,剩下的两颗树的重心编号非常不好求,一个常见的想法是我们反过来,考虑每个节点有多少种情况作为树的重心,计算每个点对答案的贡献. 下面我们就需要大力分类讨论了.假设我们现在考 ...
- Vuex 状态管理的工作原理
Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...
- transition过渡2D、3D效果
过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 帧动画:通过一帧 ...
- IPV4地址学习笔记
IP地址由网络号和主机号组成.IPV4由32位正整数来表示. A类IP:8位网络号+24主机号,网络号以0开头,网络号范围0~127 B类IP:16位网络号+16主机号,网络号以10开头,网络号范围1 ...
- FileOutStream
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- LeetCode随缘刷题之无重复字符的最长子串
欢迎评论区交流. package leetcode.day_12_04; /** * 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. * <p> * 示例1: * &l ...
- 关于es update异常 ScriptException[dynamic scripting for [groovy] disabled]
你需要在elasticsearch.yml中配置 script.disable_dynamic: false 然后别忘了重启.
- suse 12 二进制部署 Kubernetets 1.19.7 - 第09章 - 部署kubelet组件
文章目录 1.9.部署kubelet 1.9.0.创建kubelet bootstrap kubeconfig文件 1.9.1.创建kubelet配置文件 1.9.2.配置kubelet为system ...
- app内嵌H5网页(webviewJavaScriptBridge)
摘要:使用的插件为webviewJavaScriptBridge,app端需要引入一下这个包,html页面只需一段JS代码 与IOS交互 <! 申明交互(此处代码固定) > functio ...