0
0

Pydanticのバリデーション設定時、選択した文字列だけに制限したい場合

Last updated at Posted at 2023-12-09

注意
未経験から転職した、一年目のエンジニアが、作成したものになります。
そのため、至らぬ表現や、誤った表現をしている場合があります。

経験豊富な先輩エンジニアの方々へ
もし、誤った情報を記載していた際は、大変お手数をおかけしますが、ご指摘いただけますと幸いです。

少しでも、皆様のお役に立てれば幸いです。

記事の内容

  • やりたいこと
  • なぜ行ったか
  • 対処方法
  • 参考文献

やりたいこと

Pydantic でバリデーションを行う際に、特定の文字列かどうか?を判別したい

なぜ行ったか

PullDown 等で値を取得した場合、得られる値は、特定の決まった値になります。

その時に、無事に望んだ値が得られているか?を確認したい。

対処方法

  1. 得られると想定されるデータを、リストにまとめ、変数に格納する
  2. validator 関数を定義し、入力チェックを行う。

注意
Pydantic のバージョンアップにより、@validator の代わりに、

@field_validator を使用することが推奨されているので、以下のコードは、@field_validator を使用しています。

from pydantic import field_validator

nameList = ["taro", "koki", "takashi"]

class User(BaseModel):
    name: str
    age: int

    @field_validator("name") # 制限したいフィールド値を指定
    def nameCheckInGenderList(cls, name):  # 第一引数は固定。第2引数は上記で指定したフィールドの値に別名をつける
        if name in nameList:
            return name
        else:
            raise ValueError("選択された名前を入力してください")

余談ですが、in 関数は、リストの中の要素の中のいづれかと一致するか?を示したものです。

特定の値かどうかを判定するには、validator 関数か、正規表現を用いるしかないみたいです(正規表現は、今回の趣旨から外れるので割愛)

2/11 追記
このバリデーションならLiteralを使うことでも実現できますよ。
とのコメントをいただきました。
https://docs.pydantic.dev/latest/api/standard_library_types/#typingliteral

 flavor: Literal['apple', 'pumpkin']

文字列で選択式をそのまま表現できるため、上記のやり方が一番好ましいと思います!
@palu0707 さん、コメントありがとうございます!

もし、より良い方法がございましたら、ぜひコメントで教えて頂けきたいです。

少しでも、お役に立てれば幸いです。

参考文献

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0