目录
1.1 使用drf自带校验规则UniqueValidator
1.2 在序列化器外部自定义校验函数并在validators中使用,且只能引用该方法,不能调用
2.单字段校验: def validate_字段名(self, attr:str)
3.多字段联合校验: def validate(self, attr:dict)
1.validators校验函数
a).可以在序列化器字段上使用validators函数指定自定义的校验规则
b).validators值必须为序列类型(类表),在列表中可以添加多个校验规则
c).DRF框架自带的UniqueValidator校验器,必须指定queryset参数指定查询集对象,用于对该字段的唯一性进行校验,UniqueValidator里面还可以使用message指定自定义报错信息
在序列化器需要反序列化输入校验的字段中,指定validators=[校验规则1,校验规则2...]参数,可以使用drf自带的校验规则UniqueValidator, 也可以使用自定义的的校验规则
1.1 使用drf自带校验规则UniqueValidator
validators= [UniqueValidator(queryset=待对比的查询集,message=‘校验失败的提示’)
校验失败输出
1.2 在序列化器外部自定义校验函数并在validators中使用,且只能引用该方法,不能调用
1.2.1 可以在序列化器类外部自定义校验函数
1.2.2 第一个参数为待校验的值
1.2.3 如果校验不通过,必须要抛出serializers.ValidationError('报错信息‘)异常,可以指定具
体的报错信息
1.2.3 需要将自定义校验函数名的引用放到序列化器类中待校验字段的validators列表中
校验规则执行顺序:
对字段类型校验->validators列表中的校验规则从前往后依次验证->从后往前依次验证min_length,max_value等其他规则->校验器内部单字段校验规则->校验器内部多字段联合校验规则
反序列化校验
2.单字段校验: def validate_字段名(self, attr:str)
2.1 序列化器内部自定义的校验方法格式: validate_待校验字段名 对单个字段进行校验
2.2 内部自定义校验方法,必须 return xxx, 一般 return attr, 这样attr 会在校验通过后赋值给被
校验的字段
2.3 如果校验不通过,必须raise serializers.ValidationError('具体报错提示‘)异常
2.4 如果校验通过,需要将校验通过的值attr返回,这样才能将值赋给被校验字段
2.5 如果在调用此内部单字段自定义校验规则前,前面的其他校验规则不通过,那么不会调用此
规则
校验结果:
3.多字段联合校验: def validate(self, attr:dict)
3.1 可以在序列化器中对多个字段自定义校验方法进行联合校验
3.2 使用固定的validate方法,会接收前面校验方式通过的字典数据
3.3 当序列化器类定义字段时添加的校验规则都通过后,且每个字段的单字段校验规则也通过
后,才会调用多字段联合校验方法validate
联合校验失败时:
代码:
# projects/serializers.py
# 此文件定义子应用projects具备的模型类对应的序列化器
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from interfaces.models import Interfaces
from projects.models import Projects
class InterfacesSerializer(serializers.Serializer):
"""自定义的序列化器类实际上是Field的子类"""
id = serializers.IntegerField(label='接口id', help_text='接口名称', read_only=True)
name = serializers.CharField(label='接口名称', help_text='接口名称',
max_length=50, min_length=2)
tester = serializers.CharField(label='接口测试人员', help_text='接口测试人员',
max_length=50, min_length=2)
projects= serializers.CharField(label='接口所属项目id', help_text='接口所属项目id',
read_only=True)
def is_contain_keyword(values:str):
"""
定义一个校验规则,判断字段是否以'xx项目'结尾
:param values: 序列化器中待校验的字段
:return:
"""
# 如果校验失败,要raise serializers.ValidationError异常,并可以指定异常信息提示
if not values.endswith('项目'):
raise serializers.ValidationError("项目名称必须以'项目'结尾")
# 如果校验成功,不做任何处理,接着往下校验
pass
class ProjectSerializer(serializers.Serializer):
"""
"""
id = serializers.IntegerField(label='项目id', help_text='项目id',
read_only=True)
full_name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=20, min_length=4,
error_messages={"max_length": "项目名称不能超过20个字符",
"min_length": "项目名称不能小于4个字符"},
validators=[UniqueValidator(queryset=Projects.objects.all(),
message='项目名称不能重复'),
is_contain_keyword]
)
leader = serializers.CharField(label='项目负责人', help_text='项目负责人', max_length=20, min_length=2)
is_execute = serializers.BooleanField(label='项目是否执行', help_text='项目是否执行', required=False)
desc = serializers.CharField(label='项目描述', help_text='项目描述', allow_null=True, allow_blank=True)
create_time = serializers.DateTimeField(label='项目从创建时间', help_text='项目创建时间',
format='%Y-%m-%d %H:%M:%S',read_only=True)
update_time = serializers.DateTimeField(label='项目跟新时间', help_text='项目更新时间',
read_only=True)
# 将指定的从表序列化器类作为interfaces_set以返回多个字段值,因为InterfacesSerializer类也是Field的子类,所以可以作为字段属性
interfaces_set = InterfacesSerializer(label='所属接口信息', help_text='所属接口信息',
read_only=True, many=True)
def validate_full_name(self, attr: str):
"""
自定义单字段校验规则:validate_xxx
1。若校验失败,跟序列化器类外部定义的校验方法一样raise serializers.ValidationError()
2。若校验成功,则需要return xxx,这个xxx会赋值给被校验的字段full_name
:param attr: 待校验值
:return: attr
"""
if not attr.startswith('春田'):
raise serializers.ValidationError("项目名必须以'春田'开头")
return attr
def validate(self, attrs: dict):
"""
自定义多字段校验规则:validate,例如注册模块的输入密码与确认密码功能,会用到多字段联合校验
1。若校验失败,跟序列化器类外部定义的校验方法一样raise serializers.ValidationError()
2。若校验成功,则需要return xxx,这个xxx会赋值给被校验的字段
:param attrs: 待校验的多个关联字段
:return: attrs
"""
if not attrs.get("full_name").startswith("春田") or not attrs.get('is_execute'):
raise serializers.ValidationError("项目名必须以'春田'开头 或者 is_execute为True")
return attrs