来源:自学PHP网 时间:2020-09-27 14:57 作者:小飞侠 阅读:次
[导读] Django模型验证器介绍与源码分析...
今天带来Django模型验证器介绍与源码分析教程详解
前言 在Django的模型字段参数中,有一个参数叫做validators,这个参数是用来指定当前字段需要使用的验证器,也就是对字段数据的合法性进行验证,比如大小、类型等。 Django的验证器可以分为模型相关的验证器和表单相关的验证器,它们基本类似,但在使用上有区别。 本文讨论的是模型相关的验证器。 一、自定义验证器 一个验证器其实就是一个可调用的对象(函数或类),接收一个初始输入值作为参数,对这个值进行一系列逻辑判断,如果不满足某些规则或者条件,则表示验证不通过,抛出一个ValidationError异常。如果满足条件则通过验证,不返回任何内容(也就是默认的return None),可以继续下一步。 验证器具有重要作用,可以被重用在别的字段上,是工具类型的逻辑封装。 下面是一个验证器的例子,它只允许偶数通过验证: from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ def validate_even(value): if value % 2 != 0: raise ValidationError( _('%(value)s is not an even number'), params={'value': value}, ) 通过下面的方式,将偶数验证器应用在字段上: from django.db import models class MyModel(models.Model): even_field = models.IntegerField(validators=[validate_even]) 因为验证器运行之前,(输入的)数据会被转换为 Python 对象,因此我们可以将同样的验证器用在 Django form 表单中(事实上Django为表单提供了另外一些验证器): from django import forms class MyForm(forms.Form): even_field = forms.IntegerField(validators=[validate_even]) 你还可以通过Python的魔法方法__cal__()编写更复杂的可配置的验证器,比如Django内置的RegexValidator验证器就是这么干的。 验证器也可以是一个类,但这时候就比较复杂了,需要确保它可以被迁移框架序列化,确保编写了deconstruction()和__eq__()方法。这种做法很难找到参考文献和博文,要靠自己摸索或者研究DJango源码。 二、工作机制 让我们来测试一下上面写的验证器: >>> from .models import MyModel >>> a = MyModel.objects.create(even_field=3) >>> a <MyModel: MyModel object (1)> >>> a.even_field 3 什么?!!!不是说只有偶数才能通过验证吗?这里我提供了数字3,可是为什么创建成功了?? 我们接着在admin站点中注册MyModel模型,然后在图形化界面后台中创建MyModel的实例,你会发现这个时候验证器起作用了,奇数是无法通过表单验证的!
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com