【问题标题】:Django model validator not working on createDjango 模型验证器无法创建
【发布时间】:2016-11-30 06:29:35
【问题描述】:

我有一个带有字段验证器的模型

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

 class MyModel(model.Model):
     name = models.CharField()
     size = models.IntegerField(validators=[MinValueValidator(1),MaxValueValidator(10)])

验证器在 django 管理面板中运行良好,当我尝试输入大于 10 的值时,它向我显示错误消息 '确保此值小于或等于 10'并且不允许保存。

但是,当我在 django shell 中尝试时,验证器不起作用,它允许保存记录,我不知道为什么验证器没有在这里抛出错误消息。

>>>form app.models import MyModel
>>>MyModel.objects.create(name="Some Name", size=15)
<MyModel: Some Name>

如果我错过了什么或我在这里犯了任何错误,请你建议我。请帮我解决这个问题,这对我来说非常有用,在此先感谢。

【问题讨论】:

  • 以下答案是否解决了您的疑问?如果是,请点赞并接受。

标签: validation django-models


【解决方案1】:

Django 验证主要是应用程序级别的验证,而不是数据库级别的验证。此外,模型验证不会在模型的 save/create 上自动运行。如果您想在代码中的某个时间验证您的值,则需要手动进行。

例如:

from django.core.exceptions import ValidationError
form app.models import MyModel

instance = MyModel(name="Some Name", size=15)
try:
    instance.full_clean()
except ValidationError:
    # Do something when validation is not passing
else:
    # Validation is ok we will save the instance
    instance.save()

更多信息你可以在 django 的文档https://docs.djangoproject.com/en/1.10/ref/models/instances/#validating-objects看到

在管理中它会自动运行,因为所有模型表单 (ModelForm) 都会在表单验证的同时运行模型验证过程。

如果您需要验证数据,因为它来自不受信任的来源(用户输入),您需要使用 ModelForms 并仅在表单有效时保存模型。

【讨论】:

    【解决方案2】:

    验证器仅在您使用 ModelForm 中的模型时才起作用。

    https://docs.djangoproject.com/en/dev/ref/validators/#how-validators-are-run

    您可以通过覆盖 clean() 和 full_clean() 方法来执行模型验证

    【讨论】:

      【解决方案3】:

      验证器仅适用于表单和模型表单。不能与模型定义一起使用,因为它在应用端而不是数据库端运行。

      【讨论】:

        【解决方案4】:

        来自 django 文档:

        请注意,当您保存 模型,但如果您使用的是 ModelForm,它将运行您的验证器 在表单中包含的任何字段上。

        https://docs.djangoproject.com/en/3.1/ref/validators/#how-validators-are-run

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题。 因此,验证器仅在您使用表单和模型表单填写时才起作用。

          但是,通过在 shell 中创建,您可能希望在验证器上线之前对其进行测试。 因此,这是有助于验证验证器的附加代码。

          >>>form app.models import MyModel
          >>>MyModel.size.field.run_validators(value=<undesirable value>)
          

          【讨论】:

            【解决方案6】:

            您可以将其添加到您的模型中并在 save() 中调用它。

                def save(self, *args, **kwargs):
                    self.run_validators()
                    super().save(*args, **kwargs)
            
                def run_validators(self) -> None:
                    for field_name, field_value in model_to_dict(self).items():
                        model_field = getattr(UserSearchHistory, field_name)
                        field = getattr(model_field, 'field', object())
                        validators = getattr(field, 'validators', list())
                        for validator_func in validators:
                            if field_value is not None:
                                validator_func(field_value)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-04
              • 2011-04-02
              • 1970-01-01
              • 2017-08-16
              • 1970-01-01
              • 2019-10-08
              • 1970-01-01
              • 2021-11-28
              相关资源
              最近更新 更多