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内置函数bin() oct()等实现进制转换
Dec 30 Python
python文件和目录操作函数小结
Jul 11 Python
python生成圆形图片的方法
Mar 25 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
python生成特定分布数的实例
Dec 05 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 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
ASP和PHP都是可以删除自身的
2007/04/09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
Python探索之ModelForm代码详解
2017/10/26 Python
python re模块的高级用法详解
2018/06/06 Python
使用Python如何测试InnoDB与MyISAM的读写性能
2018/09/18 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
老师自我鉴定范文
2013/12/25 职场文书
人力资源职位说明书
2014/07/29 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
民主生活会发言材料
2014/10/20 职场文书
MySQL常用慢查询分析工具详解
2022/08/14 MySQL