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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
浅析Python中的join()方法的使用
May 19 Python
Python中的日期时间处理详解
Nov 17 Python
python查看列的唯一值方法
Jul 17 Python
python读取有密码的zip压缩文件实例
Feb 08 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
基于Python函数和变量名解析
Jul 19 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 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 实例化类的一点摘记
2008/03/23 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
Python实现测试磁盘性能的方法
2015/03/12 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
python目录与文件名操作例子
2016/08/28 Python
python计算日期之间的放假日期
2018/06/05 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
软件测试有哪些?什么是配置项?
2012/02/12 面试题
社团活动策划书范文
2014/01/09 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
Python 中 Shutil 模块详情
2021/11/11 Python