我有一个带字段验证器的模型
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>
如果我错过了什么或者犯了什么错误,你能给我建议吗?请帮助我解决这个问题,这对我来说是非常好的,谢谢。
8条答案
按热度按时间nzrxty8p1#
Django的验证主要是应用程序级的验证,而不是数据库级的验证。同样,模型验证也不会在
save
/create
上自动运行。如果你想在代码中的某个时间验证你的值,那么你需要手动进行。例如:
更多信息可以在django的文档www.example.com上找到https://docs.djangoproject.com/en/1.10/ref/models/instances/#validating-objects
在管理中,它会自动工作,因为所有模型表单(
ModelForm
)都将在表单验证的同时运行模型验证过程。如果您需要验证数据,因为它来自不可信的源(用户输入),您需要使用
ModelForm
s,并仅在表单有效时保存模型。sulc1iza2#
验证器仅在您使用ModelForm中的模型时才起作用。
https://docs.djangoproject.com/en/dev/ref/validators/#how-validators-are-run
您可以通过覆盖clean()和full_clean()方法来执行模型验证
disbfnqx3#
验证程序只能用于窗体和模型窗体。不能用于模型定义,因为它在应用程序端而不是数据库端运行。
wljmcqd84#
您可以将其添加到模型中,并在保存()中调用它。
fslejnso5#
来自django文档:
请注意,当您保存模型时,验证器不会自动运行,但是如果您使用ModelForm,它将对表单中包含的任何字段运行验证器。
https://docs.djangoproject.com/en/3.1/ref/validators/#how-validators-are-run
ua4mk5z46#
我遇到了同样的问题。所以验证器只有在你使用表单和模型表单来填充它的时候才起作用。
然而,通过在shell中创建,您可能希望在生效之前测试验证器,因此这里有一段额外的代码来帮助验证验证器。
zbq4xfa07#
不能在创建时运行验证程序,必须在示例中运行验证,如果未发生异常,必须保存
3hvapo4f8#
值得一提的是,模型字段验证器
如此处的validate_color:
也可以使用restf_framework(drf)序列化程序类。
https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py
所以当你在ModelForm上调用is_valid(来自django)或者在Serializer上调用is_valid(来自rest_framework)时,验证器就会运行。