BaseModelのkeyの命名規則を変換するAliasGeneratorについてメモ【備忘録】

お疲れ様です。

PydanticのBaseModelには要素のキー名の命名規則を変換する機能があります。 AliasGeneratorという機能で、BaseModelを定義する際に設定をすることができます。

pydantic.dev

例えば、frontendでTypeScript、backendでPythonを使用して開発しているときなどプログラム言語による変数の命名規則が異なるときに、API通信のタイミングで自動で言語ごとの命名規則の形式に変換することができます。

命名規則については以下参考。 一般的にPythonではsnake_case、TypeScriptではcamelCaseが変数の命名規則として使用されます。

qiita.com


設定方法は下記のようにBaseModelのmodel_configにalias_generatorを設定する形です。 今回はsnake_caseをcamelCaseに変換したいのでto_camelを設定しています。

pydantic.alias_generatorsからはto_camelの他、to_snakeとto_pascalをimportして利用可能です。 また、カスタムで作成した関数を設定することも可能です。

model_configでAliasGeneratorだけ設定したBaseModelを作成しておき、新たに作成するBaseModelに継承すると便利です。

from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel
    
    
class CamelModel(BaseModel):
    """snake_case <-> camelCase の相互変換を設定した継承用BaseModel"""
    
    model_config = ConfigDict(
        alias_generator=to_camel,
        populate_by_name=True,
    )

class RequestModel(CamelModel):
    """リクエスト用のBaseModel"""
    user_id: int = 1234
    user_name: str = "test_user"
    

class ResponseModel(CamelModel):
    """レスポンス用のBaseModel"""
    user_id: int
    user_name: str
    message: str

上記でBaseModelを使用してFastAPIでAPIエンドポイントを作成してみました。

@app.post("/test")
def base_model_test_1(
    payload: RequestModel
) -> ResponseModel:
    """postメソッドでテスト"""
    # 受け取ったリクエストモデルを表示
    print("変換なし:", payload.model_dump())
    print("変換あり:", payload.model_dump(by_alias=True))
    
    # レスポンスモデルを返す
    response = ResponseModel(
        user_id=payload.user_id,
        user_name=payload.user_name,
        message="postメソッドでレスポンスモデルのテスト"
    )
    
    return response

実際に実行し、SwaggerUIを確認してみるとこんな感じで表示されます。 リクエストとレスポンスのschemaがcamelCaseで表示されており、リクエストの値の入力時もcamelCaseのまま行います。

swaggerui

以下はAPI内の処理で受け取った値をprintしてみた表示結果です。 受け取った値を辞書型にdumpするとsnake_caseの形で表示されていますね。 このようにPythonの処理内ではsnake_caseで扱うことができます。

一応aliasを適用するとcamelCaseに変換することも可能です。あまり使用することはないと思いますが…。

print

ソースコード

今回の検証用に作成したコードはこちらに残しています。

github.com