0

私は1つのフィールドを持つモデルを持っています(これは合成例です):

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

1 つのフィールドのみを検証する場合は、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 に答える