在Django中,对数据进行校验有两种方式:一种是通过Form校验,一种是通过Model校验。在此,我对Model中的校验方法做下记录。
示例之前补充以下几点:
1、Django数据校验方式分为以下三步:
Model.clean_fields() 验证字段基本规则比如长度格式等;
Model.clean() 可自定义验证条件和报错信息;
Model.validate_unique() 为验证添加的唯一性约束。
2、此三步验证通过调用full_claen(exclude=None, validate_unique=True)来依次执行。
exclude:可以用来指定不需要执行校验的field。ModelForm也利用这个参数来将field排除。
validate_unique:用来指定是否需要执行Model.validate_unique()。
3、而full_clean()又是通过调用is_valid()方法来执行。
4、save()执行的时候是不会自动调用full_clean()来进行校验的。
校验应该在save()执行之前完成,你可以先在form进行校验,也可以在model中进行校验。但是,你必须确保通过这两个校验之后的数据是绝对没有问题的“干净”数据,然后再调用save()方法将数据存储入库。
5、校验中的错误处理
我们使用ValidationError来在Model.clean中抛出错误,这个错误信息将会存储在以NON_FIELD_ERRORS为key的字典中。这个key是用来存储对于整个model中的错误信息的。
如何获取校验的错误信息:
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]
如何指定对于某个特定的field的校验错误信息:
class Article(models.Model): ... def clean(self): if self.status == 'draft' and self.pub_date is not None: # raise ValidationError({'pub_date': _('Draft entries may not have a publication date.')}) raise ValidationError({'pub_date': 'Draft entries may not have a publication date.'}) ...
如何指定多个field的校验错误信息:
class Article(models.Model): ... def clean(self): if self.status == 'draft' and self.pub_date is not None: raise ValidationError({'pub_date': 'Draft entries may not have a publication date.', 'creator': 'Creator can't be null'}) ...
如何指定全局性校验错误信息:
class Article(models.Model): ... def clean(self): if self.status == 'draft' and self.pub_date is not None: raise ValidationError('Draft entries may not have a publication date.') ...
进入正题:
一、如何使用验证器:
在验证某个字段的时候,在模型或者自定义form表单中传递一个 validators 参数用来指定验证器,进一步对数据进行过滤。
或者,通过model中的 Field类型 或者一些参数就可以指定。
比如 EmailValidator ,我们可以通过 指定字段类型为EmailField 来指定。
比如 MaxValueValidator ,我们可以通过 max_value 、max_length参数来指定。
class Interview(models.Model): feedback = models.TextField(max_length=1024, validators=[MinLengthValidator(20, message='不少于20字')], verbose_name='面试反馈') mail = models.EmailField(max_length=64, blank=True, null=True, verbose_name='邮箱') age= models.IntegerField(max_value=64, blank=True, null=True, verbose_name='年龄')
二、常用自带验证器:
1. MaxValueValidator :验证最大值。
2. MinValueValidator :验证最小值。
3. MinLengthValidator :验证最小长度。
4. MaxLengthValidator :验证最大长度。
5. EmailValidator :验证是否是邮箱格式。
6. URLValidator :验证是否是 URL 格式。
7. RegexValidator :如果还需要更加复杂的验证,那么我们可以通过正则表达式的验证。
class Demo(models.Model): telephone = models.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])
三、自定义验证器:
方法:
如果你想要自定义model的校验,或者想要修改model的属性的话,就要重写clean()方法。
class Interview(models.Model): feedback = models.TextField(max_length=1024, validators=[MinLengthValidator(20, message='不少于20字')], verbose_name='面试反馈') mail = models.EmailField(max_length=64, blank=True, null=True, verbose_name='邮箱') age= models.IntegerField(max_value=64, blank=True, null=True, verbose_name='年龄' ... def clean(self): if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20: raise ValidationError({'feedback': '不少于20字'})
效果:
如果你想做一个全局性的错误提示,可以这样:
... def clean(self): if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20: raise ValidationError('不少于20字吧')
效果:
以上这篇django Model层常用验证器及自定义验证器详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?