自定义serializers.ValidationError的错误返回

博客 动态
0 258
羽尘
羽尘 2022-03-09 10:56:19
悬赏:0 积分 收藏

自定义 serializers.ValidationError 的错误返回

rest_framework serializers ValidationError 错误信息自定义 key 值自定义 serializers.ValidationError 的错误返回DRF 自定义ValidationError错误

在使用DRF进行反序列过程中,总是需要校验字段,然后返回错误结果。可以使用默认的自定义校验项,也可以自定义校验项。而默认的自定义校验项总是差强人意。

版本

Django 2.2.3Python 3.8.8djangorestframework 3.13.1

目标效果

image

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

image

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

    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})

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

image

采用自定义校验函数之后,返回格式有所改善,但是此种返回都是以字段名为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 statusfrom rest_framework.exceptions import APIException, ErrorDetailfrom rest_framework.utils.serializer_helpers import ReturnList, ReturnDictdef 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:字段级验证不起作用

posted @ 2022-03-09 09:58 不吃浅水鱼 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员