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打印斐波拉契数列实例
Jul 07 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
Python如何在循环内使用list.remove()
Jun 01 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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分页类的代码
2011/05/18 PHP
php curl选项列表(超详细)
2013/07/01 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
使用console进行性能测试
2015/04/27 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
python中随机函数random用法实例
2015/04/30 Python
python版简单工厂模式
2017/10/16 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
深入了解Django View(视图系统)
2019/07/23 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
30年同学聚会邀请函
2014/01/25 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
学生安全责任书模板
2014/07/25 职场文书
求职自荐信怎么写
2015/03/04 职场文书
医院合作意向书范本
2015/05/08 职场文书
婚宴父亲致辞
2015/07/27 职场文书
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS