其他分享
首页 > 其他分享> > django数据校验

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