1、常用几种校验,在序列化器类中我们定义,并在在对应字段中添加,失败提示
min_length=6, max_length=20,这样如果长度不在6到20 将提示错误。 error_messages={ 'min_length': '仅允许6~20个字符的确认密码', 'max_length': '仅允许6~20个字符的确认密码', }这样填写错误时按照此处进行提示,。
password_confirm = serializers.CharField(label='确认密码', help_text='确认密码',
min_length=6, max_length=20,
write_only=True,
error_messages={
'min_length': '仅允许6~20个字符的确认密码',
'max_length': '仅允许6~20个字符的确认密码', })
2、也可以在序列化器的Meta中进行定义,
extra_kwargs = {
'username': {
'label': '用户名',
'help_text': '用户名',
'min_length': 6,
'max_length': 20,
'error_messages': {
'min_length': '仅允许6-20个字符的用户名',
'max_length': '仅允许6-20个字符的用户名',
}
},
'email': {
'label': '邮箱',
'help_text': '邮箱',
'write_only': True,
'required': True,
# 添加邮箱重复校验
'validators': [UniqueValidator(queryset=User.objects.all(), message='此邮箱已注册')],
},
3.在meta中使用校验器,validators中使用功能唯一检验UniqueValidator,需要指定查询集,
如果饿哦们定义了一个函数,规定必须以项目包含项目关键字。
def is_contains_keyword(value): if '项目' not in value: raise serializers.ValidationError('项目名称中必须得包含“项目”关键字')
可以这样进行校验。
name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=20, min_length=5, error_messages={ 'min_length': '项目名称不能少于5位', 'max_length': '项目名称不能超过20位' }, validators=[UniqueValidator(queryset=Projects.objects.all(), message='项目名称不能重复'), is_contains_keyword])
4、还可以重写validate函数,进行多字段校验,
def validate(self, attrs): if attrs.get('password') != attrs.get('password_confirm'): raise serializers.ValidationError('密码与确认密码不一致') attrs.pop('password_confirm') return attrs
5、还可以定义validate_name,进行对name字段的单字段校验。
def validate_name(self, attr: str): if not attr.endswith('项目'): raise serializers.ValidationError('项目名称必须得以“项目”结尾') return attr
我们进行数据创建是发生了什么?数据时怎样进行校验的。
1、前端请求后,会调用到CreateModelMixin中的create函数,然后会调用is_valid进行数据校验
serializer.is_valid(raise_exception=True)
2、在is_valid中调用run_validation
self._validated_data = self.run_validation(self.initial_data)
3、在run_validation中依次调用to_internal_value、run_validators、validate
value = self.to_internal_value(data) self.run_validators(value) value = self.validate(value)
3.1在to_internal_value中,
对每个字段类型进行校验 、调用单字段校验方法,例如:validate_name 3.2在run_validators
获取所有的校验器进行校验,如果有错,抛出异常。
3.3value = self.validate(value)
调用多字段联合校验方法validate方法,例如进行密码和确认密码的一致性校验。
ps:如果需要校验后的数据,可以使用validated_data获取。