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入门篇之字典
Oct 17 Python
总结python爬虫抓站的实用技巧
Aug 09 Python
python实现二分查找算法
Sep 21 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
python使用tkinter实现简单计算器
Jan 30 Python
Python实现全排列的打印
Aug 18 Python
python3 mmh3安装及使用方法
Oct 09 Python
python类中super() 的使用解析
Dec 19 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
python初步实现word2vec操作
Jun 09 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
python 基于opencv实现高斯平滑
Dec 18 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
56.com视频采集接口程序(PHP)
2007/09/22 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
python实现百度语音识别api
2018/04/10 Python
Pythonic版二分查找实现过程原理解析
2020/08/11 Python
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
涉外文秘个人求职的自我评价
2013/10/07 职场文书
小学后勤管理制度
2014/01/14 职场文书
美容院营销方案
2014/03/05 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
个人主要事迹材料
2014/08/26 职场文书
医生个人年终总结
2015/02/28 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL