在使用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 的错误返回的更多相关文章

  1. TCP connect的错误返回值

    如果是TCP套接字,调用connect函数将激发TCP三次握手过程,而且仅在连接建立成功或出错时返回,其中错误返回可能有下面几种情况: (1)若TCP客户没有收到SYN分节的响应,则返回ETIMEDO ...

  2. Spring验证的错误返回------BindingResult

    Spring验证的错误返回------BindingResult 参考资料:http://www.mkyong.com/spring-mvc/spring-mvc-form-errors-tag-ex ...

  3. phpcms v9自定义表单提交后返回上一页实现方法

    PHPcms v9中提交自定义表单后默认都是回到首页的,是不是感觉很不爽! 接下来,就说下phpcms v9自定义表单提交后返回上一页实现方法. 1.找到这个文件 phpcms\modules\for ...

  4. Struts2自定义Field级别的错误提示信息

    自定义Field级别的错误提示信息步骤: 在action包中新建一个以Action命名的properties文件,如:RegisterAction.properties 2. 然后在该属性文件中指定每 ...

  5. jQuery ajax请求错误返回status 0和错误error的问题

    上周发现一个jQuery ajax请求错误返回status 0和错误error的问题,responseText是"error",状态码是0而不是200: $.ajax({ type ...

  6. 14、SpringBoot------定制错误返回内容json格式

    开发工具:STS 前言: 在前后端分离的项目中,当前端向后端请求资源失败时,想知道具体的错误原因,给用户予以提示. 但是,在springboot中返回内容是固定的.并不适合我们前端进行分析. 所以,就 ...

  7. Laravel自定义错误提示,自定义异常类提示,自定义错误返回信息,自定义错误页面

    方法一 新增CustomException.php文件 App\Exceptions\CustomException.php <?php namespace App\Exceptions; us ...

  8. 自定义 404 与 500 错误页面,URL 地址不会重定向(一)

    对于 404 与 500 错误发生时,我们希望自己定义一个更加人性化的页面. 例子 当访问下面这个地址时: http://localhost/aaaa/bbb/ccc/ddd/eee/fff/ggg ...

  9. 解决spring boot中rest接口404,500等错误返回统一的json格式

    在开发rest接口时,我们往往会定义统一的返回格式,列如: { "status": true, "code": 200, "message" ...

随机推荐

  1. 《Effective TypeScript》条款22 - 类型收缩

    本文主要记录书中关于TypeScript类型收缩的内容 本文主要内容如下 类型收缩的一些方法 条件判断 抛错误 instanceof 和 in 属性检查 "标签联合"或" ...

  2. 基于java处理.docx格式的word合并

    如下实例是将 2.docx和3.docx合并,写到empty.docx中,不适用于.doc格式,public static void main(String[] args) { File file1 ...

  3. JAVA多线程学习十五 - 阻塞队列应用

    一.类相关属性 接口BlockingQueue<E>定义: public interface BlockingQueue<E> extends Queue<E> { ...

  4. Linux-一次执行多个命令 ; && ||

    一次执行多个命令,多个命令之间用:号隔开 cmd1;cmd2:cmd3 这样前后执行的时候没有依赖性,如果有下列要求呢 1. cmd1执行失败那就不要执行后面的命令 2. cmd1失败了才去指令后面的 ...

  5. 分享刚出炉的基于Blazor技术的Web应用开发框架

    这是最近刚刚重构完成的项目,有点迫不及待的分享给大家,为了跟上技术升级把原来基于MVC Razor Page开源项目 RazorPageCleanArchitecture 进行重构, 前端用Blazo ...

  6. Nacos中服务删除不了,怎么办?

    前两天遇到了一个问题,Nacos 中的永久服务删除不了,折腾了一番,最后还是顺利解决了.以下是原因分析和解决方案,建议先收藏,以备不时之需. 临时实例和持久化实例是 Nacos 1.0.0 中新增了一 ...

  7. Go语言程序调试

    1. Go语言二进制程序分析    在分析一些使用GOlang语言进行编译的恶意程序时,由于程序在被打包成二进制程序时会打包诸多引用的库,并且作者对二进制程序进行了去符号化,导致在动态或是静态分析时函 ...

  8. JMM之Java中锁概念的分类总结

    在Java的并发编程中不可避免的涉及到锁.从不同维护可以将锁进行不同的分类,如下: 1.乐观锁和悲观锁(根据读写操作的比例划分) 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数 ...

  9. k8s核心资源之:标签(label)

    简介 label是标签的意思,一对 key/value ,被关联到对象上,k8s中的资源对象大都可以打上标签,如Node.Pod.Service 等 一个资源可以绑定任意多个label,k8s 通过  ...

  10. 大家好 这里是yi术家

    好久没有来打卡了的说,可能你以为我忽然一时的热度刷题,但是事情并不是这样. 我在之前的章节里写到,我觉得每天的打卡有点浪费资源和时间,所以决定一周打一次卡. 可是上周好像也忘了打卡的样子. 这样任性的 ...