django数据校验
作者:互联网
serializer
对于最基础的字段校验,可以放在model中,但是大部分的字段校验应该放在serializer中
校验
校验方式很多,每个人去写这个代码应该都是不一样的
第一种是可以在model中使用,这种情况我认为是直接调用自定义的校验类中校验器,这些校验器被封装起来的原因是具有普遍性,可以抽取出来做工具类,比如如下代码:
name = models.CharField(_('任务名称'), validators=[
validators.validate_general_name, ], unique=True, max_length=200,
error_messages={
'unique': _("任务名称重复."),
}
)
# validate_general_name的实现
general_name_re = _lazy_re_compile(r'^[^\\:\?"<>|/`\*]+$')
validate_general_name = validators.RegexValidator(
general_name_re,
# Translators: "letters" means latin letters: a-z and A-Z.
_('输入不包含 <> \\ / ` * ? " : | 的有效“字段”。'),
'invalid'
)
通过 给validators
传入一个校验器列表,就可以直接进行校验了
第二种是在serilizier中进行数据校验,分为单个字段校验和多个字段校验,也叫局部钩子和全局钩子
局部钩子
遵守严格的命名方法,方法名必须以‘valiidate_<字段名>(self, data)’作为验证方法名,否则序列化器在调用 is_valid()
时找不到,如下:
class UploadFileSerializer(serializers.ModelSerializer):
class Meta:
model = UploadFileModel
fields = ['uuid', "name", "user", "filter_type"]
def validate_filter_type(self, data):
if data not in settings.DATA_UPLOAD_CONSTAINT.keys():
raise ValidationError(message="指定的filter_type有误!")
return data
这里就是检测filter_type类型
全局钩子
函数签名已经固定了,以'validate(self, attrs)'作为方法名,全局钩子其实很少用,除非对那种表单数据进行校验,不然每次都是对所有字段进行校验有点鸡肋
def validate(self, attrs):
age = attrs.get('age')
classmate = attrs.get('classmate')
if (age < 20) and str(classmate).startswith('5'):
raise serializers.ValidationError('对不起!年龄20以下不能加入到5字开头的班级中')
return attrs
标签:name,钩子,校验,django,attrs,validate,general,数据 来源: https://www.cnblogs.com/EtAl0rs/p/16359062.html