PUROGU LADESU

ポエムがメインのブログです。

【Django】モデルインスタンスのsaveとバリデーション

Formクラスにもバリデーションを定義することができるが、
Modelクラスにも定義することができる。

full_clean()

バリデーションを実施するにはfull_clean()を呼べばよい。
full_clean()では下記が呼ばれる。
clean_field() -> 各フィールドのvalidatorsに定義したものが呼ばれる
clean() -> フィールドに関連しない全体のチェック。cleanを定義していなければ何もしない。
validate_unique() -> フィールドに定義したunique制約をチェックする
validate_constraints() -> Meta.constraintsに定義したデータベース制約をチェックする

save()では呼ばれないのでその前で呼ぶ。
問題があった場合はValidationErrorをキャッチする。

"""インスタンスの保存処理"""
try:
    sample = Sample()
    sample.full_clean()
    sample.save()

except ValidationError as e:
    print(e)
except DatabaseError as e:
    print(e)
"""モデルクラス"""
def clean(self) -> None:
        """フィールドに関連づかないバリデーションエラー"""
        something_happen = True
        if something_happen:
            raise ValidationError("何らかのエラー!!")

save()で呼ぶにはオーバーライドする。

"""モデルクラス"""
    def save(self, force_insert, force_update, using, update_fields):
        """saveの前になにかさせる場合"""
        self.full_clean()
        return super().save(force_insert, force_update, using, update_fields)
    

is_valid()

そもそもFormクラスのis_valid()を呼ぶことでこいつが呼ばれる思想なのかもしれない。
Formのis_valid() -> full_clean() -> _post_clean() -> Modelのfull_clean()
この順番で呼ばれてくるようだ。

モデルインスタンスリファレンス | Django ドキュメント | Django