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