django Model层常用验证器及自定义验证器详解


Posted in Python onJuly 15, 2020

在Django中,对数据进行校验有两种方式:一种是通过Form校验,一种是通过Model校验。在此,我对Model中的校验方法做下记录。

示例之前补充以下几点:

1、Django数据校验方式分为以下三步:

Model.clean_fields() 验证字段基本规则比如长度格式等;

Model.clean() 可自定义验证条件和报错信息;

Model.validate_unique() 为验证添加的唯一性约束。

2、此三步验证通过调用full_claen(exclude=None, validate_unique=True)来依次执行。

exclude:可以用来指定不需要执行校验的field。ModelForm也利用这个参数来将field排除。

validate_unique:用来指定是否需要执行Model.validate_unique()。

3、而full_clean()又是通过调用is_valid()方法来执行。

4、save()执行的时候是不会自动调用full_clean()来进行校验的。

校验应该在save()执行之前完成,你可以先在form进行校验,也可以在model中进行校验。但是,你必须确保通过这两个校验之后的数据是绝对没有问题的“干净”数据,然后再调用save()方法将数据存储入库。

5、校验中的错误处理

我们使用ValidationError来在Model.clean中抛出错误,这个错误信息将会存储在以NON_FIELD_ERRORS为key的字典中。这个key是用来存储对于整个model中的错误信息的。

如何获取校验的错误信息:

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
try:
  article.full_clean()
except ValidationError as e:
  non_field_errors = e.message_dict[NON_FIELD_ERRORS]

如何指定对于某个特定的field的校验错误信息:

class Article(models.Model):
  ...
  def clean(self):
    if self.status == 'draft' and self.pub_date is not None:
      # raise ValidationError({'pub_date': _('Draft entries may not have a publication date.')})
      raise ValidationError({'pub_date': 'Draft entries may not have a publication date.'})
    ...

如何指定多个field的校验错误信息:

class Article(models.Model):
  ...
  def clean(self):
    if self.status == 'draft' and self.pub_date is not None:
      raise ValidationError({'pub_date': 'Draft entries may not have a publication date.', 
                 'creator': 'Creator can't be null'})
    ...

如何指定全局性校验错误信息:

class Article(models.Model):
  ...
  def clean(self):
    if self.status == 'draft' and self.pub_date is not None:
      raise ValidationError('Draft entries may not have a publication date.')
    ...

进入正题:

一、如何使用验证器:

在验证某个字段的时候,在模型或者自定义form表单中传递一个 validators 参数用来指定验证器,进一步对数据进行过滤。

或者,通过model中的 Field类型 或者一些参数就可以指定。

比如 EmailValidator ,我们可以通过 指定字段类型为EmailField 来指定。

比如 MaxValueValidator ,我们可以通过 max_value 、max_length参数来指定。

class Interview(models.Model):
  feedback = models.TextField(max_length=1024, validators=[MinLengthValidator(20, message='不少于20字')], verbose_name='面试反馈')
  mail = models.EmailField(max_length=64, blank=True, null=True, verbose_name='邮箱')
  age= models.IntegerField(max_value=64, blank=True, null=True, verbose_name='年龄')

二、常用自带验证器:

1. MaxValueValidator :验证最大值。

2. MinValueValidator :验证最小值。

3. MinLengthValidator :验证最小长度。

4. MaxLengthValidator :验证最大长度。

5. EmailValidator :验证是否是邮箱格式。

6. URLValidator :验证是否是 URL 格式。

7. RegexValidator :如果还需要更加复杂的验证,那么我们可以通过正则表达式的验证。

class Demo(models.Model):
telephone = models.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

三、自定义验证器:

方法:

如果你想要自定义model的校验,或者想要修改model的属性的话,就要重写clean()方法。

class Interview(models.Model):
  feedback = models.TextField(max_length=1024, validators=[MinLengthValidator(20, message='不少于20字')], verbose_name='面试反馈')
  mail = models.EmailField(max_length=64, blank=True, null=True, verbose_name='邮箱')
  age= models.IntegerField(max_value=64, blank=True, null=True, verbose_name='年龄'
  ...
 
  def clean(self):
    if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20:
      raise ValidationError({'feedback': '不少于20字'})

效果:

django Model层常用验证器及自定义验证器详解

django Model层常用验证器及自定义验证器详解

如果你想做一个全局性的错误提示,可以这样:

...
  def clean(self):
    if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20:
      raise ValidationError('不少于20字吧')

效果:

django Model层常用验证器及自定义验证器详解

以上这篇django Model层常用验证器及自定义验证器详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python调用shell的方法
Nov 20 Python
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
python采集百度百科的方法
Jun 05 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 Python
Python实现播放和录制声音的功能
Aug 12 Python
python logging模块的使用详解
Oct 23 Python
浅谈Django前端后端值传递问题
Jul 15 #Python
浅谈python出错时traceback的解读
Jul 15 #Python
Django视图、传参和forms验证操作
Jul 15 #Python
一文解决django 2.2与mysql兼容性问题
Jul 15 #Python
django 模型字段设置默认值代码
Jul 15 #Python
django序列化时使用外键的真实值操作
Jul 15 #Python
Django:使用filter的pk进行多值查询操作
Jul 15 #Python
You might like
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
js 分栏效果实现代码
2009/08/29 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
解析Python中的二进制位运算符
2015/05/13 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
python实现QQ批量登录功能
2019/06/19 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
python datetime处理时间小结
2020/04/16 Python
Python中如何添加自定义模块
2020/06/09 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
小学新学期教师寄语
2014/01/18 职场文书
代理协议书范本
2014/04/22 职场文书
高二学生评语大全
2014/04/25 职场文书
城管综合整治方案
2014/05/01 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
营销计划书
2015/01/17 职场文书
财务工作失误检讨书
2015/02/19 职场文书
保留意见审计报告
2015/06/05 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书