• Django-9-序列化器中各种校验方式


    1、在序列化器字段上使用validators指定自定义校验器

    1.可以在序列化器字段上使用validators指定自定义校验器

    2.validators必须得指定为序列类型(往往为列表),在列表中可以添加多个校验

    3.UniqueValidator校验器进行唯一约束的校验,必须得指定queryset参数,使用message指定具体报错信息

    4.可以自定义校验函数,对某个字段进行进一步校验

    5.自定义校验函数,直接将函数名放置到validators列表中

    6.某个字段的校验顺序

    校验字段类型 -> 通用的约束参数(min_length、max_length) -> 依次校验validators中指定的校验规则
    -> 进入到序列化器类中调用单字段的校验方法 -> 进入到序列化器类中调用多字段的联合校验方法(validate方法)

        name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=10, min_length=3,
                                     error_messages={'min_length': '项目名称不能少于3位', 'max_length': '项目名称不能超过10位'},
                                     validators=[
                                         UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
                                         is_contain_keyword
                                     ])

    2、在序列化器类中定义对单字段进行校验的方法

    1.可以在序列化器类中定义对单字段进行校验的方法
    2.单字段校验方法的名称,必须以validate_作为前缀
    3.接收的参数为前端传递的值
    4.如果在字段定义时校验不通过,那么不会调用序列化器类中单字段的校验方法
    5.如果校验不通过,必须得返回ValidationError异常对象
    6.如果校验通过,那么一般需要将校验之后的值返回
        def validate_name(self, value):
            value: str
            if not value.endswith('项目'):
                raise serializers.ValidationError('项目名称必须得以“项目”结尾')
            return value

     

    3、validate用于多个字段的联合校验

    1.validate用于多个字段的联合校验
    2.接收的参数为前端传递的所有参数(单字段均以校验通过)
    3.如果在单字段的校验方法中校验不通过,那么不会调用validate
    4.如果校验不通过,必须得返回ValidationError异常对象
    5.如果校验通过,那么一般需要将校验之后的数据返回
    def validate(self, attrs):
        name = attrs.get('name', '')
        attrs: dict
        leader = attrs.get('leader', '')
        if len(name + leader) > 10:
            raise serializers.ValidationError('项目名与项目负责人名称总长度不超过10个字符')
    
        return attrs


    4、to_internal_value

       # 序列化器类进行校验时,首先会调用to_internal_value方法,开始进行校验
       # 调用父类的to_internal_value方法 -> 校验字段类型  -> 通用的约束参数(min_length、max_length) -> 依次校验validators中指定的校验规则
       # -> 进入到序列化器类中调用单字段的校验方法 -> 父类的to_internal_value方法调用结束 -> 进入到序列化器类中调用多字段的联合校验方法(validate方法)
    def to_internal_value(self, data):
       
        some_data = super().to_internal_value(data)
        some_data['leader'] = some_data['leader'].upper()
        return some_data

     

    5、to_representation

    用于自定义返参结果

    例:

    def validate_gender(self, value):
            # 0转化为女,1转化为男 --第一种方法
            """校验gender只能为0或者1,0转化为女,1转化为男"""
            value: str
            if value != "0" and value != "1":
                raise serializers.ValidationError("gender只能为0或者1")
            if value == "0":
                return ''
            else:
                return ''
    
        def to_representation(self, instance):
            # 0转化为女,1转化为男,只输出username和gender --第二种方法
            result = super().to_representation(instance)
            if result['gender'] == '0':
                result['gender'] = ''
            else:
                result['gender'] = ''
            result2 = {
                "tester": result['tester'],
                "gender": result['gender']
            }
            return result2
  • 相关阅读:
    vue--vuex详解
    vue2.0的一个小demo,
    vue---子调父 $emit (把子组件的数据传给父组件)
    高阶函数总结
    三个方法(apply、call、bind)
    JS的一些总结(函数声明和函数表达式的区别,函数中的this指向的问题,函数不同的调用方式,函数也是对象,数组中的函数调用)
    原型对象(下)
    案例:贪吃蛇
    原型对象(上)
    案例(拖拽对话框、高清放大镜、自制滚动条、元素的隐藏方式、表格隔行变色、tab切换效果、字符串拼接、刷新评论)
  • 原文地址:https://www.cnblogs.com/erchun/p/14490437.html
Copyright © 2020-2023  润新知