美文网首页程序员软件测试
7、serializer序列化器类-制定数据校验规则

7、serializer序列化器类-制定数据校验规则

作者: 小啊小狼 | 来源:发表于2020-09-16 10:11 被阅读0次

    Django将其它格式 (字典、json、XML等)转换为程序中的数据,例如:将json字符串转换为django中的模型类对象并进行校验的过程,这个过程称之为反序列化。简单来说,就是对前端传入的参数合法性进行校验,这个功能通常也由定义好的序列化器类来实现。
    下面我们介绍几种常用的在序列化器内部定义的校验规则

    1.定义在filed中的参数

    如:required,max_length,min_length.....等等,对传入数据的各个字段本身的属性进行校验

    2.自带的校验器

    django自带的校验规则,可以按照以下用法实现。

    • 唯一键校验如:UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
    • 添加到字段的validators=[]参数的列表中
    • 自定义error_message,指定每个校验规则未通过的返回错误信息
    name=serializers.CharField(max_length=10,label="项目名称",help_text="项目名称",min_length=3,validators=[validators.UniqueValidator(queryset=Projects.objects.all(),message="项目名name已存在"),name_contain_x]
                                   ,error_messages={"required": "该字段必传", "max_length": "长度不能操作10个字节","min_length":"长度不能少于3个字节"})
    

    3、序列化器类ProjectsModelSerializer之外可以自定义校验规则

    自定义校验函数

        def validate_name(self, value):  #固定写法validate_+要校验多字段名
            if '测试' in value:
                raise serializers.ValidationError("项目名称中不能包含测试")
            return value
    

    需要自定义的字段 validators参数(列表)中增加外部定义的校验规则函数 函数名(添加到字段的validators=[]参数的列表中)


    image.png

    4、序列化器类ProjectsModelSerializer内可以自定义校验方法

    4.1单字段校验validate_fieldName

    • 自定义校验函数,名称默认validate_+要校验的字段名
    • 需要return
    • 不需要在字段 validators参数(列表)中增加自定义的校验规则函数,会自动执行校验
        # 在序列化器类中对单字段进行校验
        # a.必须要以validate_作为前缀
        # b.校验方法名称为:validate_字段名
        # c.一定要返回校验之后的值
        def validate_name(self, value):
            if '非常' in value:
                raise serializers.ValidationError("项目名称中不能包含‘非常’")
            return value
    

    4.2多字段联合校验

    • 自定义校验函数,函数名一定是:validate(self,attrs)
    • 当校验成功之后, 一定要返回attrs
    • 需要return
    • 不需要在字段 validators参数(列表)中增加自定义的校验规则函数,会自动执行校验
     def validate(self, attrs):  #多字段联合校验
         if len(attrs["name"]) == 8 and "测试" not in attrs["tester"]:
             raise serializers.ValidationError("项目名称长度不为8并且tester中不包含测试")
         return attrs
    

    完整代码及注释如下

    # 是前端输入的待校验的值
    def is_name_contain_x(value):
        # 如果校验失败,一定要抛出ValidationError异常类对象,第一个参数可以指定具体的报错信息
        if 'x' in value:
            raise serializers.ValidationError("项目名称中不能包含x")
    class ProjectsSerializer(serializers.Serializer):
        """
        可以定义序列化器类,来实现序列化和反序列化操作
        a.一定要继承serializers.Serializer或者Serializer的子类
        b.默认情况下,可以定义序列化器字段,序列化器字段名要与模型类中字段名相同
        c.默认情况下,定义几个序列化器字段,那么就会返回几个数据(到前端,序列化输出的过程),前端也必须得传递这几个字段(反序列化过程)
        """
        name = serializers.CharField(max_length=10, label='项目名称', help_text='项目名称', min_length=2,
                                     validators=[validators.UniqueValidator(queryset=Projects.objects.all(), message='项目已存在'), is_name_contain_x])
        leader = serializers.CharField(max_length=200, label='项目负责人', help_text='项目负责人', read_only=True)
        tester = serializers.CharField(max_length=200, label='测试人员', help_text='测试人员', allow_blank=True, read_only=True,
                                       error_messages={"required": "该字段必传1", "max_length": "长度不能操作200个字节"})
    
        # 在序列化器类中对单字段进行校验
        # a.必须要以validate_作为前缀
        # b.校验方法名称为:validate_字段名
        # c.一定要返回校验之后的值
        def validate_name(self, value):
            if '非常' in value:
                raise serializers.ValidationError("项目名称中不能包含‘非常’")
            return value
    
        # 在序列化器类中对多字段进行联合校验
        # a.校验方法名称为:validate
        # b.一定要返回校验之后的值
        # c.attrs为前端输入的待校验参数
        def validate(self, attrs):
            # if len(attrs['name']) != 8 or '测试' not in attrs['tester']:
            #     raise serializers.ValidationError("项目名长度不为8或者测试人员名称中不包含'测试'")
            return attrs
    

    二、序列化器的校验顺序

    1、先校验定义在filed中的参数
    2、校验filed中的validators
    3、校验自定义的校验规则
    4、再校验validate_fieldName函数
    5、最后校验多字段联合校验 validate(self,attrs)

    相关文章

      网友评论

        本文标题:7、serializer序列化器类-制定数据校验规则

        本文链接:https://www.haomeiwen.com/subject/pmwfyktx.html