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 07 Python
Python字符串处理实例详解
May 18 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
python实现简单神经网络算法
Mar 10 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
详解python做UI界面的方法
Feb 27 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
Python求平面内点到直线距离的实现
Jan 19 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
python实现调用摄像头并拍照发邮箱
Apr 27 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 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/03 咖啡文化
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
提高php编程效率技巧
2015/08/13 PHP
html中table数据排序的js代码
2011/08/09 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
jquery实现拖动效果
2016/08/10 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
vue.js中created方法作用
2018/03/30 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
layui table 参数设置方法
2018/08/14 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
Python实现简单多线程任务队列
2016/02/27 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
迟到检讨书1000字
2014/01/15 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
企业安全生产检查制度
2015/08/06 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技