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

时间:2018-10-23 10:47:59

标签: 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)

现在,这可以在我的管理网站和模型表单中自动运行。但是,当我从外壳创建对象时,或者说是手动API端点时,则不会强制执行验证程序。

在django中是否有一个内置函数,就像我可以直接在save方法中调用的注释中的函数一样?还是我必须使用save方法再次手动验证我的字段?谢谢。

1 个答案:

答案 0 :(得分:1)

这是关于验证对象的documentation。基本上,如果调用对象的full_clean()方法,则将在该对象上运行所有验证。您只能通过调用self.clean_fields()来运行各个字段验证器。

但是,通常,在save()方法中添加验证不是一个好习惯。原因是在大多数Django应用程序中,您将创建一个表单(ModelForm),该表单将调用验证方法,并在验证失败时能够向用户返回有意义的信息。

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

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

shell不是常规的交互方法,应谨慎使用,因为它会绕开应用程序的正常流程。