day22-Model数据验证以及钩子
一、前言
其实在django内部也是支持数据验证的,只是这个数据验证比较弱而已,只能支持单个的验证,但是对于组合的,或者固定的,我们就验证不了,你说可以验证邮箱格式,但是不能验证 不能@qq.com结尾的邮箱,等等,所以这个东西知道就行,说用嘛,其实没有啥用,但是我们要知道这个东西是如何实现的。
二、Model数据验证以及钩子
2.0、数据库表
说明:以下示例都是基于如下数据库表的操作
class User(models.Model): name = models.CharField(max_length=32,db_index=True) #创建索引 email = models.EmailField(max_length=30)
2.1、model数据验证
说明:我们正常情况下,虽然在django指定了EmailField类型,但是真正的,我们在django后台用model操作的时候,是不做任何验证的,所以我可以写任何的字符串,但是我们用上full_clean,就会需要验证了
from app01 import models def index(request): obj = models.User(name="zhangqigao",email="root") obj.full_clean() #没有这个,email是不做验证的,有了full_clean是需要做验证的,验证不通过是要报错的,所以验证的时候,我们直接自己抓异常,进行异常处理 obj.save() return HttpResponse("index")
接下来,我们看一下源码:
①先做了对每一个字段验证
②然后进行了clean一下:
③clean是model基础类提供的一个钩子,它其实什么也不用做:
所以我们在这个基础之上,我们在定义一下我们的model验证:
class User(models.Model): name = models.CharField(max_length=32,db_index=True) #创建索引 email = models.EmailField(max_length=30) def clean(self): #对所有字段验证完毕之后,才会执行这个clean方法 from django.core.exceptions import ValidationError c = User.objects.filter(name=self.name).count() if c: raise ValidationError
model操作会遇到很多情况:
1、比如验证正则表达式,我还要单独额外的操作,比如email ,如果是 @qq.com结尾的邮箱匹配呐
2、组合验证操作,比如组合索引等等
所以这个东西知道就行,说明的django是支持这个东西的。但是不实用。