其他分享
首页 > 其他分享> > Django-9-序列化器中各种校验方式

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

 

标签:器类,gender,校验,value,Django,length,器中,序列化
来源: https://www.cnblogs.com/erchun/p/14490437.html