0

我有一个字段的模型(这是合成示例):

model Tank:
      oxygen = models.PositiveSmallIntegerField(
          _("Oxygen %"),
          help_text="%",
          default=21,
          validators=[MinValueValidator(21.0), MaxValueValidator(50.0)],
          null=True,
      )

我用数据解析一些文件。我想在编写模型实例之前验证输入数据。像这样的东西

oxygen = get_raw_data()
Tank.oxygen.validate(oxygen) # this is wrong I know :)
# if value is valid do something
# else do something

我应该写什么而不是 Tank.oxygen.validate(oxygen)?我可以在保存模型实例时复制验证逻辑或验证数据,但也许有人知道更好的解决方案。

4

2 回答 2

1

您需要使用数据实际创建一个实例,然后调用full_clean()它:

my_tank = Tank(oxygen=oxygen)
my_tank.full_clean()
于 2013-09-09T14:27:09.090 回答
0

如果您只想验证一个字段,那么我建议您使用 form.Field 类来执行此操作:

from django import forms
from django.core.exceptions import ValidationError

oxygen_field = forms.IntegerField(required=True, min_value=21, max_value=50)

def is_oxygen_valid(value):
    try:
        oxygen_field.clean(value)
    except ValidationError:
        return False
    else:
        return True

测试:

>>> is_oxygen_valid(None)
False
>>> is_oxygen_valid(11)
False
>>> is_oxygen_valid(55)
False
>>> is_oxygen_valid('hello')
False
>>> is_oxygen_valid(list())
False
>>> is_oxygen_valid(45)
True

我假设您将首先验证氧场,然后根据结果决定做什么。您可以将此调整到您需要的任何其他领域。只需找到适当的FormField类和您可能需要的任何验证器,然后使用它。

于 2015-02-17T21:30:17.117 回答