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接收多播数据的代码
Mar 01 Python
python传递参数方式小结
Apr 17 Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 Python
python人民币小写转大写辅助工具
Jun 20 Python
对django中foreignkey的简单使用详解
Jul 28 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
新手学python应该下哪个版本
Jun 11 Python
如何解决安装python3.6.1失败
Jul 01 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
SONY ICF-F10中波修复记
2021/03/02 无线电
Thinkphp5行为使用方法汇总
2017/12/21 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
获取body标签的两种方法
2011/10/13 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
2017/12/21 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python中的闭包总结
2014/09/18 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
Python探索之SocketServer详解
2017/10/28 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
Python几种常见算法汇总
2020/06/02 Python
python程序需要编译吗
2020/06/19 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
党员民主评议个人总结
2014/10/20 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
2015年服务员工作总结
2015/04/08 职场文书
通用员工手册范本
2015/05/14 职场文书
2015小学师德工作总结
2015/07/21 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书