Django模型验证器无法创建

3lxsmp7m  于 2022-12-14  发布在  Go
关注(0)|答案(8)|浏览(194)

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

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>

如果我错过了什么或者犯了什么错误,你能给我建议吗?请帮助我解决这个问题,这对我来说是非常好的,谢谢。

nzrxty8p

nzrxty8p1#

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的文档www.example.com上找到https://docs.djangoproject.com/en/1.10/ref/models/instances/#validating-objects
在管理中,它会自动工作,因为所有模型表单(ModelForm)都将在表单验证的同时运行模型验证过程。
如果您需要验证数据,因为它来自不可信的源(用户输入),您需要使用ModelForm s,并仅在表单有效时保存模型。

sulc1iza

sulc1iza2#

验证器仅在您使用ModelForm中的模型时才起作用。
https://docs.djangoproject.com/en/dev/ref/validators/#how-validators-are-run
您可以通过覆盖clean()和full_clean()方法来执行模型验证

disbfnqx

disbfnqx3#

验证程序只能用于窗体和模型窗体。不能用于模型定义,因为它在应用程序端而不是数据库端运行。

wljmcqd8

wljmcqd84#

您可以将其添加到模型中,并在保存()中调用它。

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)
fslejnso

fslejnso5#

来自django文档:
请注意,当您保存模型时,验证器不会自动运行,但是如果您使用ModelForm,它将对表单中包含的任何字段运行验证器。
https://docs.djangoproject.com/en/3.1/ref/validators/#how-validators-are-run

ua4mk5z4

ua4mk5z46#

我遇到了同样的问题。所以验证器只有在你使用表单和模型表单来填充它的时候才起作用。
然而,通过在shell中创建,您可能希望在生效之前测试验证器,因此这里有一段额外的代码来帮助验证验证器。

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

zbq4xfa07#

不能在创建时运行验证程序,必须在示例中运行验证,如果未发生异常,必须保存

3hvapo4f

3hvapo4f8#

值得一提的是,模型字段验证器
如此处的validate_color

bg_color = models.CharField(
    max_length=50, default="f0f2f5", validators=[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)时,验证器就会运行。

相关问题