python Django Rest_Framework框架 反序列化时数据校验的三种方法(图文并茂版)
Posted 温柔且上进c
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Django Rest_Framework框架 反序列化时数据校验的三种方法(图文并茂版)相关的知识,希望对你有一定的参考价值。
反序列化时数据校验的三种方法
注意:
- 下述三个数据校验的方法,都会在视图函数中的
is_valid()
方法被调用时自动调用,不需要我们手动调用
单个字段的验证
- 当我们需要对传入的数据中的某个字段进行单独的校验,则可以使用这种方法
- 单个字段验证的方法命名规则:validate_<字段名> 例如:validate_name
def validate_name(self, data):
data为此字段传入的数据,不需要手动传入,会自动将此字段的数据传入- 在此方法体中,书写对此字段验证的逻辑代码
- 举例如下:对name字段进行校验,不能使用Python或Java作为名称:,逻辑如下
def validate_name(self, data):
if data in ['Python', 'Java']:
# 验证失败后,可以通过抛出异常来告知 is_valid方法,is_valid方法会将异常抛出
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()
方法被调用时自动调用,不需要我们手动调用
以上是关于python Django Rest_Framework框架 反序列化时数据校验的三种方法(图文并茂版)的主要内容,如果未能解决你的问题,请参考以下文章
python 中 django 的问题-------- 请高人指点 尽量详细点哦 初学django