在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字'})

效果:

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

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

如果你想做一个全局性的错误提示,可以这样:

  ...
  def clean(self):
    if self.result_1 == InterviewResult.FAIL and len(self.feedback) < 20:
      raise ValidationError('不少于20字吧')

效果:

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

以上这篇django Model层常用验证器及自定义验证器详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

P70系列延期,华为新旗舰将在下月发布

3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。

而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?

根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。