在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
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】
- 曹方.2005-遇见我【钛友文化】【WAV+CUE】
- Unity6引擎上线:稳定性提升、CPU性能最高提升4倍
- 人皇Sky今日举行婚礼!电竞传奇步入新篇章