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中内置的日志模块logging用法详解
Jul 12 Python
详解python的ORM中Pony用法
Feb 09 Python
Python2中文处理纪要的实现方法
Mar 10 Python
python format 格式化输出方法
Jul 16 Python
对python 命令的-u参数详解
Dec 03 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
python实现PID算法及测试的例子
Aug 08 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
Python中的引用和拷贝实例解析
Nov 14 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
python 实现分组求和与分组累加求和代码
May 18 Python
python 制作一个gui界面的翻译工具
May 14 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
第十四节--命名空间
2006/11/16 PHP
php miniBB中文乱码问题解决方法
2008/11/25 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
php 验证码实例代码
2010/06/01 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python的mysql数据库的更新如何实现
2017/07/31 Python
python 中的int()函数怎么用
2017/10/17 Python
Django model update的多种用法介绍
2020/03/28 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
python 下载文件的几种方法汇总
2021/01/06 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
计算机操作自荐信
2013/12/07 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
社区重阳节活动总结
2015/03/24 职场文书
python 中的jieba分词库
2021/11/23 Python