Django:模型中的验证顺序
Django: Order of validation in Models
最近发现可以直接在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 了解更多详情。
最近发现可以直接在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 了解更多详情。