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 文件和路径操作函数小结
Nov 23 Python
python抓取网页中的图片示例
Feb 28 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
python爬虫之自制英汉字典
Jun 24 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
Python 动态变量名定义与调用方法
Feb 09 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
python实现自动清理文件夹旧文件
May 10 Python
Elasticsearch 索引操作和增删改查
Apr 19 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中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
js生成的验证码的实现与技术分析
2014/09/17 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
Python 制作糗事百科爬虫实例
2016/09/22 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
毕业生就业推荐信范文
2013/12/01 职场文书
经理秘书找工作求职信
2013/12/19 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
小学教师管理制度
2014/01/18 职场文书
30年同学聚会感言
2014/01/30 职场文书
元旦获奖感言
2014/03/08 职场文书
入党积极分子评语
2014/05/04 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
设计师求职信
2014/07/01 职场文书
学习型党组织心得体会
2014/09/12 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
安全第一课观后感
2015/06/18 职场文书
python如何进行基准测试
2021/04/26 Python
工厂无线对讲系统解决方案
2022/02/18 无线电