Django Model Validation with Custom Validators: 使用自定义验证器验证模型数据

2023-04-07 00:00:00 模型 自定义 验证

在Django中,我们可以使用自定义验证器来验证模型数据。

自定义验证器是一个简单的Python函数,它接收一个值作为参数并返回一个错误消息,如果该值无效,则该错误消息将与其他验证器一起显示。

下面是一个例子:

from django.core.exceptions import ValidationError

def validate_pidancode(value):
    if "pidancode" in value.lower():
        raise ValidationError("不能包含pidancode.")

在这里,我们定义了一个名为validate_pidancode的自定义验证器。它检查传递的值是否包含pidancode字符串,并抛出一个ValidationError异常,如果它存在,则该异常包含自定的错误消息。

要将这个自定义验证器应用到模型中,我们可以在模型字段定义的validators参数中指定它:

from django.db import models

class MyModel(models.Model):
    my_field = models.CharField(max_length=50, validators=[validate_pidancode])

这里,我们将validate_pidancode函数添加到my_field的validators列表中。模型中的my_field现在将自动验证不包含pidancode字符串。

现在,让我们来看看一个更完整的例子,来展示更多关于自定义验证器的使用方式:

from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _

def validate_pidancode(value):
    if "pidancode" in value.lower():
        raise ValidationError(_("不能包含pidancode."))

def validate_pidegg(value):
    if "pidegg" in value.lower():
        raise ValidationError(_("不能包含pidegg."))

class MyModel(models.Model):
    name = models.CharField(max_length=50, validators=[validate_pidancode, validate_pidegg])
    age = models.IntegerField()

    def clean(self):
        super().clean()

        if self.age < 18:
            raise ValidationError(_("年龄必须大于等于18岁."))

    def save(self, *args, **kwargs):
        self.full_clean()
        super().save(*args, **kwargs)

在这里,我们定义了两个自定义验证器validate_pidancode和validate_pidegg,并将它们应用于MyModel中的name字段。

我们还重写了MyModel的clean方法,这个方法将在保存之前对对象进行完整的数据验证。在这个方法中,我们添加一个简单的验证规则,以确保年龄大于等于18岁。

最后,我们重写了MyModel的save方法,以确保在保存之前调用clean方法进行数据验证。

使用这里提供的自定义验证器,我们可以更加容易地验证模型数据,以确保它们满足特定的条件。

相关文章