ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django数据校验

2022-06-09 14:02:25  阅读:163  来源: 互联网

标签:name 钩子 校验 django attrs validate general 数据


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有