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实现简单多线程任务队列
Feb 27 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
python生成九宫格图片
Nov 19 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
Django实现学员管理系统
Feb 26 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
Python3 assert断言实现原理解析
Mar 02 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
Python中的 No Module named ***问题及解决
Jul 23 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
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
PHP强制转化的形式整理
2020/05/22 PHP
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python生成器以及应用实例解析
2018/02/08 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
pycharm设置注释颜色的方法
2018/05/23 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
python3中rank函数的用法
2019/11/27 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
python中adb有什么功能
2020/06/07 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
药学专业个人自我评价
2013/11/11 职场文书
初中女生自我鉴定
2013/12/19 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang