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 07 Python
python中执行shell的两种方法总结
Jan 10 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
利用numpy和pandas处理csv文件中的时间方法
Apr 19 Python
Python判断变量名是否合法的方法示例
Jan 28 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 Python
Python 实现交换矩阵的行示例
Jun 26 Python
python实现邮件发送功能
Aug 10 Python
python glom模块的使用简介
Apr 13 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
对盗链说再见...
2006/10/09 PHP
php基础知识:函数基础知识
2006/12/13 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
python处理cookie详解
2014/02/07 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
如何在sublime编辑器中安装python
2020/05/20 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
护理专业学生职业生涯规划范文
2014/03/11 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
实习工作表现评语
2014/12/31 职场文书
2015元旦感言
2015/12/09 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers