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 相关文章推荐
使用rpclib进行Python网络编程时的注释问题
May 06 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
Python中类型检查的详细介绍
Feb 13 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
Python中进程和线程的区别详解
Oct 29 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
详解python持久化文件读写
Apr 06 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
django 信号调度机制详解
Jul 19 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
python 模拟登陆163邮箱
Dec 15 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
模拟flock实现文件锁定
2007/02/14 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
javascript getElementsByTagName
2011/01/31 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
python字典序问题实例
2014/09/26 Python
Unicode和Python的中文处理
2017/03/19 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
军训考核自我鉴定
2014/02/13 职场文书
综治宣传月活动总结
2014/04/28 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
会计求职自荐信范文
2015/03/04 职场文书
家长意见和建议怎么写
2015/06/04 职场文书