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直接访问私有属性的简单方法
Jul 25 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
Python中int()函数的用法浅析
Oct 17 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
深入浅析Python传值与传址
Jul 10 Python
Python实现合并excel表格的方法分析
Apr 13 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
python中文分词库jieba使用方法详解
Feb 11 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
用python修改excel表某一列内容的操作方法
Jun 11 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中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
jquery foreach使用示例
2013/09/12 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
纯js实现动态时间显示
2020/09/07 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
详解vue axios中文文档
2017/09/12 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
python list中append()与extend()用法分享
2013/03/24 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
详解Python正则表达式re模块
2019/03/19 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Python pip 常用命令汇总
2020/10/19 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
现代化办公人员工作的自我评价
2013/10/16 职场文书
金融管理应届生求职信
2014/02/20 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android