djangoModel层常用验证器及自定义验证器详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

djangoModel层常⽤验证器及⾃定义验证器详解
在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层常⽤验证器及⾃定义验证器详解就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

相关文档
最新文档