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中for循环详解
Jan 17 Python
对于Python的Django框架使用的一些实用建议
Apr 03 Python
Python中用startswith()函数判断字符串开头的教程
Apr 07 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
PyQt5每天必学之布局管理
Apr 19 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
利用python开发app实战的方法
Jul 09 Python
Python中函数的返回值示例浅析
Aug 28 Python
Python sep参数使用方法详解
Feb 12 Python
python pandas.DataFrame.loc函数使用详解
Mar 26 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 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
多文件上载系统完整版
2006/10/09 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
smarty实现多级分类的方法
2014/12/05 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
Javascript之文件操作
2007/03/07 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python实现简单的文字识别
2018/11/27 Python
Python元组常见操作示例
2019/02/19 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
Django之模板层的实现代码
2019/09/09 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
django queryset相加和筛选教程
2020/05/18 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
班风学风建设方案
2014/05/06 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers