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中去空格函数的用法
Aug 21 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 Python
使用Python对Csv文件操作实例代码
May 12 Python
python实现教务管理系统
Mar 12 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
解析python实现Lasso回归
Sep 11 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 Python
call在Python中改进数列的实例讲解
Dec 09 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 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 单引号与双引号的区别
2009/11/24 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
php中switch语句用法详解
2015/08/17 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
Python中多线程的创建及基本调用方法
2016/07/08 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
Numpy数组的广播机制的实现
2020/11/03 Python
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
Linux的文件类型
2016/07/05 面试题
工程监理应届生求职信
2013/11/09 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
初中生期末评语大全
2014/04/24 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
项目合作意向书
2015/05/08 职场文书
小学运动会前导词
2015/07/20 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js