注意
未経験から転職した、一年目のエンジニアが、作成したものになります。
そのため、至らぬ表現や、誤った表現をしている場合があります。
経験豊富な先輩エンジニアの方々へ
もし、誤った情報を記載していた際は、大変お手数をおかけしますが、ご指摘いただけますと幸いです。
少しでも、皆様のお役に立てれば幸いです。
記事の内容
- やりたいこと
- なぜ行ったか
- 対処方法
- 参考文献
やりたいこと
Pydantic でバリデーションを行う際に、特定の文字列かどうか?を判別したい
なぜ行ったか
PullDown 等で値を取得した場合、得られる値は、特定の決まった値になります。
その時に、無事に望んだ値が得られているか?を確認したい。
対処方法
- 得られると想定されるデータを、リストにまとめ、変数に格納する
- 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 さん、コメントありがとうございます!
もし、より良い方法がございましたら、ぜひコメントで教えて頂けきたいです。
少しでも、お役に立てれば幸いです。