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实现代理服务功能实例
Nov 15 Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
Jan 17 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
python中pickle模块浅析
Dec 29 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
用Python进行栅格数据的分区统计和批量提取
May 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
drupal 代码实现URL重写
2011/05/04 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Python使用gensim计算文档相似性
2016/04/10 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
python MD5加密的示例
2020/10/19 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
信息管理专业推荐信
2013/10/29 职场文书
电焊工岗位职责
2014/03/06 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
房产遗嘱范本
2015/08/06 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
php双向队列实例讲解
2021/11/17 PHP