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判断端口是否打开的实现代码
Feb 10 Python
用python写asp详细讲解
Dec 16 Python
python使用htmllib分析网页内容的方法
May 08 Python
Python中用altzone()方法处理时区的教程
May 22 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
通过cmd进入python的实例操作
Jun 26 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 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 文本文章分页代码 按标记或长度(不涉及数据库)
2012/06/07 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Django通过json格式收集主机信息
2020/05/29 Python
Melissa香港官网:MDreams
2016/07/01 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
高校教师岗位职责
2014/03/18 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
灵山大佛导游词
2015/02/04 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
企业团队精神心得体会
2016/01/19 职场文书
检讨书怎么写?
2019/06/21 职场文书
八年级作文之感恩
2019/11/22 职场文书
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers