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之os操作方法(详解)
Jun 15 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Python实现结构体代码实例
Feb 10 Python
学习Python需要哪些工具
Sep 04 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python实现区域填充的示例代码
Feb 03 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 Python
Python简易开发之制作计算器
Apr 28 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开发过程中常用函数收藏
2009/12/14 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
浅谈python jieba分词模块的基本用法
2017/11/09 Python
python最长回文串算法
2018/06/04 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
django解决跨域请求的问题
2018/11/11 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
生日宴会主持词
2014/03/20 职场文书
党风廉政建设责任书
2014/04/14 职场文书
环保专项行动方案
2014/05/12 职场文书
会计主管岗位职责
2015/04/02 职场文书