我有一个带有字段验证器的模型
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>
如果我错过了什么或者我在这里犯了什么错误,请你建议我。请帮我解决这个问题,这对我来说非常好,谢谢你。
答案 0 :(得分:8)
Django验证主要是应用程序级别验证,而不是DB级别的验证。此外,模型验证不会自动在模型的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
)都将在表单验证的同时运行模型验证过程。
如果您需要验证数据,因为它来自不受信任的来源(用户输入),您需要使用ModelForm
并仅在表单有效时保存模型。
答案 1 :(得分:3)
验证器仅在您使用ModelForm中的模型时才有效。
https://docs.djangoproject.com/en/dev/ref/validators/#how-validators-are-run
您可以通过覆盖clean()和full_clean()方法来执行模型验证
答案 2 :(得分:1)
验证器仅适用于表单和模型表单。不能与模型定义一起使用,因为它在应用程序端而不是数据库端运行。
答案 3 :(得分:0)
来自Django文档:
请注意,当您保存验证文件时,验证程序将不会自动运行 模型,但是如果您使用的是ModelForm,它将运行您的验证器 在表单中包含的任何字段中。
https://docs.djangoproject.com/en/3.1/ref/validators/#how-validators-are-run
答案 4 :(得分:0)
我遇到了同样的问题。 因此,验证器仅在您使用 Forms 和 Model Form 填写时才起作用。
但是,通过在 shell 中创建,您可能想在上线之前测试验证器。 所以这里是帮助验证验证器的附加代码。
>>>form app.models import MyModel
>>>MyModel.size.field.run_validators(value=<undesirable value>)
答案 5 :(得分:0)
您可以将其添加到模型中并在 save() 中调用。
var intList = Iterator(range(1,10))
println("data"+intList.toList)
println(intList.hasNext)