コンテンツにスキップ

Pydantic のエイリアスについて

Pydantic 1 系でフィールド名と入力データのキー名が違う場合に、alias で対応付ける例を示す。2 系向けには更新していないため、対象のバージョンを確認してから使ってほしい。

Pydantic とは

Pydanticを使うと、Python の型アノテーションをもとにデータをバリデーションできる。FastAPI 等でも使われているライブラリだ。

Warning

本記事は pydantic 1 系の時に書いたもの。2 系の内容に更新できていないため、2 系の情報は公式ドキュメントを参照してほしい。

エイリアスの指定方法

入力データのキー名がモデルのフィールド名と異なる場合は、エイリアスで対応付けられる。公式のサンプルコードのように snake case のプロパティに upper camel case のデータフィールドを関連付けできる。

from pydantic import BaseModel


def to_camel(string: str) -> str:
    return ''.join(word.capitalize() for word in string.split('_'))


class Voice(BaseModel):
    name: str
    language_code: str

    class Config:
        alias_generator = to_camel


voice = Voice(Name='Filiz', LanguageCode='tr-TR')
print(voice.language_code)
#> tr-TR
print(voice.dict(by_alias=True))
#> {'Name': 'Filiz', 'LanguageCode': 'tr-TR'}

上のコードでVoice(name='Filiz', language_code='tr-TR')を実行すると validation エラーになる。モデルのフィールド名とエイリアス名のどちらでもモデルを作成できるようにするには、Config クラスにallow_population_by_field_name=Trueを記す必要がある。エイリアス名・フィールド名とallow_population_by_field_nameの組み合わせで、結果は次のように変わる。

呼び出し方 allow_population_by_field_name 結果
Voice(Name='Filiz', LanguageCode='tr-TR')(エイリアス名で指定) 未設定 成功する
Voice(name='Filiz', language_code='tr-TR')(フィールド名で指定) 未設定 validation エラーになる
Voice(Name='Filiz', LanguageCode='tr-TR')(エイリアス名で指定) True 成功する
Voice(name='Filiz', language_code='tr-TR')(フィールド名で指定) True 成功する

エイリアスの優先順位

同じフィールドのエイリアスを複数の手段で設定した場合、どの設定を適用するかは次の優先順位で決まる。

  1. モデルのField(..., alias=<alias>)による直接指定
  2. モデルのConfig.fieldsでの定義
  3. 親モデルのField(..., alias=<alias>)による直接指定
  4. 親モデルのConfig.fieldsでの定義
  5. モデルや親モデルの区別なく、alias_generatorによる生成