Validation Django模型验证程序不在创建上工作

Validation Django模型验证程序不在创建上工作,validation,django-models,Validation,Django Models,我有一个带有字段验证器的模型 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),MaxValue

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

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>
>>表单app.models导入MyModel
>>>MyModel.objects.create(name=“Some name”,size=15)

如果我在这里遗漏了什么或犯了什么错误,你能告诉我吗。请帮助我解决这个问题,这对我来说将是非常棒的,提前谢谢。

验证程序仅在您使用ModelForm中的模型时有效


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

Django验证主要是应用程序级验证,而不是数据库级验证。此外,模型验证不会在模型的
保存
/
创建
时自动运行。如果您想在代码中的特定时间验证您的值,那么您需要手动进行验证

例如:

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的文档

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


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

验证程序仅对表单和模型表单起作用。无法与模型定义一起使用,因为它在应用程序端而不是数据库端运行。

来自django文档:

请注意,在保存文件时,验证程序不会自动运行 但是如果您使用的是ModelForm,它将运行您的验证器 在表单中包含的任何字段上

我遇到了同样的问题。 因此,只有当您使用表单和模型表单来填充它时,验证器才会工作

然而,通过在shell中创建,您可能希望在上线之前测试验证器。 下面是帮助验证验证器的附加代码

>>>form app.models import MyModel
>>>MyModel.size.field.run_validators(value=<undesirable value>)
>>表单app.models导入MyModel
>>>MyModel.size.field.run_验证器(值=)

您可以将其添加到模型中,并在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)