Django:模型中的验证顺序

标签 django django-models django-forms django-validation

最近我发现可以直接在models.py文件中定义Django表单验证。这可以通过以下方式完成:

fev1_liter = models.DecimalField(validators=[MaxValueValidator(8.2),
             MinValueValidator(0.3)], 
             max_digits=3, decimal_places=2)

这是 forms.py 中验证的绝佳替代方案,但我确实遇到了一个非常烦人的问题: 我如何控制执行验证的顺序? 在此示例中,Django 将首先验证输入数字是否采用 x.xx 格式,然后验证最小值和最大值。这会导致一些非常困惑的错误消息。 提前致谢!

最佳答案

对于每个模型字段,field.clean() 首先通过field.validate() 执行字段验证,然后通过field.run_validators(),验证器被调用,以便它们从 field.validators 迭代器返回。

这是有道理的,因为在一般情况下,如果字段验证失败,您可以预期您的验证器会失败,因此它更容易调试。请记住,字段验证器不是强制性的,因此 field.validate() 优先。如果您想更改行为,您必须创建自己的 Field 类并覆盖 field.clean() 行为。

您可以检查 field sources了解更多详情。

关于Django:模型中的验证顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224004/

相关文章:

django - 带有中间件的自定义身份验证后端

django - 在 Django QuerySet 中,如何检查 ManyToMany 字段中的特定对象?

python - 如何在 Django view.py 中将对象传递给 HTML

python - 从 Django 中的模型搜索

python - 如何计算 Django 模型中产品的总价?

python - 过滤查询集时 forms.py 中的 Django MultiValueKeyDictError

python - django xlsxwriter 中的日期时间问题

django - Django 模型和 ModelForms 中的空白、空和必需

python - 项目中不同应用程序的 Django 文件上传?

Django模型表单同时保存两次发布请求