注意:
下述三个数据校验的方法,都会在视图函数中的is_valid()
方法被调用时自动调用,不需要我们手动调用
单个字段的验证
当我们需要对传入的数据中的某个字段进行单独的校验,则可以使用这种方法 单个字段验证的方法命名规则:validate_<字段名> 例如:validate_name def validate_name(self, data):
data为此字段传入的数据,不需要手动传入,会自动将此字段的数据传入在此方法体中,书写对此字段验证的逻辑代码 举例如下:对name字段进行校验,不能使用Python或Java作为名称: ,逻辑如下
def validate_name ( self, data) :
if data in [ 'Python' , 'Java' ] :
raise serializers. ValidationError( detail= '名字不能为Python或Java' , code= 'validate_name' )
return data
注意:
数据校验失败后,可以通过serializers.ValidationError 将异常抛出,is_valid()方法会将此异常抛出给后端,detail属性:异常的错误类型、code属性:异常抛出的方法名 数据校验通过后必须返回,否则在最终校验通过的数据中,不会包含此字段的数据
多个字段的验证
当我们需要对传入的数据的多个字段进行验证时,则可以使用这种方法: 多个字段验证的方法命名规则:validate def validate(self, attrs): attrs为序列化器实例化时,传递的data数据自定义的序列化器(data=data)
,包含所有字段的数据,为一个字典数据 类型举例如下:对name字段与age字段同时进行验证,name为wy的同学年龄不能为18,否则校验不通过 ,逻辑如下
def validate ( self, attrs) :
if attrs[ 'name' ] == 'wy' and attrs[ 'age' ] == 18 :
raise serializers. ValidationError( detail= '名字为wy的同学的年龄不能为18岁' , code= 'validate' )
return attrs
与上述方法一样:校验不通过时,可以抛出异常,校验通过时,需要将数据返回即可!!
外部函数进行校验
当某个字段在多个序列化器中都是使用了同样的校验规则进行校验,则可以将此校验规则定义在外部函数中,并可以封装成模块,在其它的序列化器中需要使用时,直接导入即可 外部函数校验命名规则:与普通的函数命名规则相同,无特殊要求,但是要见名之意 外部函数需要在字段中进行调用才可以使用:check_classmate 为我们自定义的外部校验函数,在序列化器中的字段中进行调用
classmate = serializers. CharField( validators= [ check_classmate] )
举例如下:对班级的长度进行校验,长度不为3的校验不通过!
def check_classmate ( data) :
"""外部校验函数"""
if len ( data) != 3 :
raise serializers. ValidationError( detail= '班级编号格式不正确!!!' , code= 'check_classmate' )
return data
classmate = serializers. CharField( validators= [ check_classmate] )
data 是添加方法的字段的传入值,会自动传入,不需要手动传入与上述方法一样:校验不通过时,可以抛出异常,校验通过时,需要将数据返回即可!!
总结:
根据自己所需的情况选择合适的校验方法,所有方法都会在视图函数中的is_valid()
方法被调用时自动调用,不需要我们手动调用