django 模型是否提供类似于表单的 clean_<fieldname>() 的东西?

tam*_*are 5 django django-models django-forms django-validation

我试图将所有与业务逻辑相关的验证移动到模型中,而不是将它们留在表单中。但在这里我遇到了一个棘手的情况,为此我想咨询 SO 社区。

在我的 SignupForm(一个模型表单)中,我有以下特定于字段的验证,以确保输入的电子邮件不存在。

def clean_email(self):
    email = self.cleaned_data['email']

    if ExtendedUser.objects.filter(email=email).exists():
        raise ValidationError('This email address already exists.')
    return email
Run Code Online (Sandbox Code Playgroud)

如果我要将此验证移动到模型中,根据官方文档,我会将其放入clean()相应的模型中ExtendedUser。但该文档还提到了以下内容:

Model.clean() 引发的任何 ValidationError 异常都将存储在特殊键错误字典键 NON_FIELD_ERRORS 中,该键用于与整个模型而非特定字段相关的错误

这意味着,对于clean(),我无法将由此引发的错误与特定字段相关联。我想知道模型是否提供类似于 forms' 的东西clean_<fieldname>()。如果没有,你会把这个验证逻辑放在哪里,为什么?

Ala*_*air 3

您可以将 clean 方法转换为 avalidator并在声明该字段时包含它。

另一种选择是对模型字段进行子类化并覆盖其 clean 方法。

然而,没有与表单定义方法直接等效的clean_<field name>方法。您甚至不能像表单那样将错误分配给各个字段