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)