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基础教程之元组操作使用详解
Mar 25 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
用Python写一段用户登录的程序代码
Apr 22 Python
python3+PyQt5实现拖放功能
Apr 24 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
Python PyCharm如何进行断点调试
Jul 05 Python
python自动识别文本编码格式代码
Dec 26 Python
使用keras2.0 将Merge层改为函数式
May 23 Python
Python3如何在服务器打印资产信息
Aug 27 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个人网站架设连环讲(二)
2006/10/09 PHP
模仿OSO的论坛(一)
2006/10/09 PHP
MYSQL数据库初学者使用指南
2006/11/16 PHP
php 分页类 扩展代码
2009/06/11 PHP
PHP中的Memcache详解
2014/04/05 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
利用Python演示数型数据结构的教程
2015/04/03 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
数学专业毕业生自荐信
2013/11/10 职场文书
市场营销管理制度
2014/01/29 职场文书
中考标语大全
2014/06/05 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
接收函
2019/04/22 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
go开发alertmanger实现钉钉报警
2021/07/16 Golang