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实现在pickling的时候压缩的方法
Sep 25 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
python中requests库session对象的妙用详解
Oct 30 Python
python取代netcat过程分析
Feb 10 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
关于tf.nn.dynamic_rnn返回值详解
Jan 20 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 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
重置版游戏视频
2020/04/09 魔兽争霸
php 应用程序安全防范技术研究
2009/09/25 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
js逆向解密之网络爬虫
2019/05/30 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
python字符串替换的2种方法
2014/11/30 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
仓库文员岗位职责
2014/04/06 职场文书
服务口号大全
2014/06/11 职场文书
收银员岗位职责范本
2015/04/07 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS