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中类的继承代码实例
Oct 28 Python
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
Python素数检测实例分析
Jun 15 Python
python机器学习实战之树回归详解
Dec 20 Python
pandas中去除指定字符的实例
May 18 Python
20行python代码实现人脸识别
May 05 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
python清空命令行方式
Jan 13 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
Python Selenium 设置元素等待的三种方式
Mar 18 Python
Python扫描端口的实现
Jan 25 Python
Python实现为PDF去除水印的示例代码
Apr 03 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读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
你真的了解JavaScript吗?
2007/02/24 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
高级工程师英文求职信
2014/03/19 职场文书
金融与证券专业求职信
2014/06/22 职场文书
培训科主任岗位职责
2014/08/08 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
德劲DE1105机评
2022/04/05 无线电