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)
网友评论