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程序与C程序的结合使用
Apr 07 Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 Python
详解django中使用定时任务的方法
Sep 27 Python
python3 使用traceback定位异常实例
Mar 09 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
使用pyecharts1.7进行简单的可视化大全
May 17 Python
解析Python 偏函数用法全方位实现
Jun 26 Python
Python2.6版本pip安装步骤解析
Aug 17 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
python regex库实例用法总结
Jan 03 Python
Python实现位图分割的效果
Nov 20 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原理之异常机制
2010/08/21 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
PHP生成压缩文件实例
2015/02/07 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
Python对列表中的各项进行关联详解
2017/08/15 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
土木工程专业大学毕业生求职信
2013/10/13 职场文书
教师节促销活动方案
2014/02/14 职场文书
党员违纪检讨书
2014/02/18 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技