Django框架model模型对象验证实现方法分析


Posted in Python onOctober 02, 2019

本文实例讲述了Django框架model模型对象验证实现方法。分享给大家供大家参考,具体如下:

模型对象的验证

验证一个模型涉及三个步骤:

  • 验证模型的字段 —— Model.clean_fields()
  • 验证模型的完整性 —— Model.clean()
  • 验证模型的唯一性 —— Model.validate_unique()

当调用模型的full_clean() 方法时,这三个方法都将执行。当使用ModelForm时,is_valid() 将为表单中的所有字段执行这些验证。如果你计划自己处理验证出现的错误,或者你已经将需要验证的字段从ModelForm 中去除掉,你只需调用模型的full_clean() 方法。

Model.full_clean(exclude=None, validate_unique=True)

该方法按顺序调用Model.clean_fields()、Model.clean() 和Model.validate_unique()(如果validate_unique 为True),并引发一个ValidationError,该异常的message_dict 属性包含三个步骤的所有错误。可选的exclude 参数用来提供一个可以从验证和清除中排除的字段名称的列表。ModelForm 使用这个参数来排除表单中没有出现的字段,使它们不需要验证,因为用户无法修正这些字段的错误。注意,当你调用模型的save() 方法时,full_clean() 不会 自动调用。如果你想一步就可以为你手工创建的模型运行验证,你需要手工调用它。例如:

from django.core.exceptions import ValidationError
try:
  article.full_clean()
except ValidationError as e:
  # Do something based on the errors contained in e.message_dict.
  # Display them to a user, or handle them programmatically.
  pass

full_clean() 第一步执行的是验证每个字段。

Model.clean_fields(exclude=None)

这个方法将验证模型的所有字段。可选的exclude 参数让你提供一个字段名称列表来从验证中排除。如果有字段验证失败,它将引发一个ValidationError。

full_clean() 第二步执行的是调用Model.clean()。如要实现模型自定义的验证,应该覆盖这个方法。

Model.clean()

应该用这个方法来提供自定义的模型验证,以及修改模型的属性。例如,你可以使用它来给一个字段自动提供值,或者用于多个字段需要一起验证的情形:

import datetime
from django.core.exceptions import ValidationError
from django.db import models
class Article(models.Model):
  ...
  def clean(self):
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
      raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
      self.pub_date = datetime.date.today()

Model.full_clean() 类似,调用模型的save() 方法时不会引起clean() 方法的调用。

在上面的示例中,Model.clean() 引发的ValidationError 异常通过一个字符串实例化,所以它将被保存在一个特殊的错误字典键NON_FIELD_ERRORS中。这个键用于整个模型出现的错误而不是一个特定字段出现的错误:

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]

若要引发一个特定字段的异常,可以使用一个字典实例化ValidationError,其中字典的键为字段的名称。我们可以更新前面的例子,只引发pub_date 字段上的异常:

class Article(models.Model):
  ...
  def clean(self):
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
      raise ValidationError({'pub_date': 'Draft entries may not have a publication date.'})
    ...

最后,full_clean() 将检查模型的唯一性约束。

Model.validate_unique(exclude=None)

该方法与clean_fields() 类似,只是验证的是模型的所有唯一性约束而不是单个字段的值。可选的exclude 参数允许你提供一个字段名称的列表来从验证中排除。如果有字段验证失败,将引发一个 ValidationError。

注意,如果你提供一个exclude 参数给validate_unique(),任何涉及到其中一个字段的unique_together 约束将不检查。

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
详解Python3之数据指纹MD5校验与对比
Jun 11 Python
python自动识别文本编码格式代码
Dec 26 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python实现数字炸弹游戏
Jul 17 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
python批量提取图片信息并保存的实现
Feb 05 Python
基于tensorflow权重文件的解读
May 26 Python
Python 线程池用法简单示例
Oct 02 #Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 #Python
Python shutil模块用法实例分析
Oct 02 #Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 #Python
Python全栈之列表数据类型详解
Oct 01 #Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 #Python
使用Python制作一个打字训练小工具
Oct 01 #Python
You might like
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
python使用心得之获得github代码库列表
2014/06/25 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
django模板语法学习之include示例详解
2017/12/17 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
在python中bool函数的取值方法
2018/11/01 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
大学生蛋糕店创业计划书
2014/01/13 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
学校门卫岗位职责
2014/03/16 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS