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素数检测实例分析
Jun 15 Python
python选择排序算法实例总结
Jul 01 Python
python模仿网页版微信发送消息功能
Feb 24 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
python打印n位数“水仙花数”(实例代码)
Dec 25 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python中tkinter的用户登录管理的实现
Apr 22 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模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
php目录拷贝实现方法
2015/07/10 PHP
一个简单的php路由类
2016/05/29 PHP
php cookie 详解使用实例
2016/11/03 PHP
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
pandas数据集的端到端处理
2019/02/18 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
Python连接字符串过程详解
2020/01/06 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
关于十八大的演讲稿
2014/09/15 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书