如何在 Django 的 save 方法中调用我的字段验证器?

dar*_*rse 3 django django-models

我有一个模型,其中一个字段需要字母数字字符。我使用验证器强制执行此约束。像这样的东西:

from django.core.validators import RegexValidator

validate_alphanumeric = RegexValidator(r'^[a-zA-Z0-9]*$', 'Only alphanumeric characters are allowed.')

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

    def save(self, *args, **kwargs):
        # self.call_validators() or whatever
        super(MyModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

现在,这会在我的管理站点和模型表单中自动运行。但是,当我从 shell 创建对象时,或者说手动 API 端点时,验证器不会被强制执行。

django 中是否有像我评论中那样的内置函数,我可以在 save 方法中调用它?或者我是否必须在保存方法中再次手动验证我的字段?谢谢。

dir*_*ten 5

这是验证对象文档。基本上,如果您调用对象的full_clean()方法,您将对该对象运行所有验证。您可以通过调用仅运行单个字段验证器self.clean_fields()

但一般来说,在方法中添加验证并不是一个好的做法save()。原因是在大多数 Django 应用程序中,您将创建一个表单 (a ModelForm),它将调用验证方法,并能够在验证失败时向用户返回有意义的内容。

当调用模型的save()方法时,为时已晚,无法向用户显示某些内容,因此您只能raise在此时抛出异常(并崩溃)。

form.is_valid()正常的过程(管理表单使用的)是:通过调用(调用模型)来验证表单full_clean(),然后当且仅当表单有效时,保存模型。

shell 不是常规交互方法,应非常小心地使用,因为它绕过了应用程序的正常流程。

  • 哦,我忘了提,我真的不会在我的申请中使用任何表格。它基本上将成为一个大的 API。 (2认同)