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是支持这个东西的。但是不实用。

posted @ 2018-05-03 10:03  帅丶高高  阅读(172)  评论(0编辑  收藏  举报