python

【Python】pydantic.BaseModelのdictメソッドが便利そうだったので紹介

今回はpydantic.BaseModelのdictメソッドがちょっと便利そうだったので紹介します。

pydanticとは

pydanticは外部ライブラリです。

https://pydantic-docs.helpmanual.io/

型アノテーションを利用した型の検証を厳密に行ってくれます。

私は実務でFastAPIやsqlalchemyを使用しているのでお世話になります。

通常の使用においても型検証は強いので便利です。

BaseModelのdictメソッドを紹介

今回は簡単にBaseModelを継承したUserクラスを作成しました。

from pydantic import BaseModel, Field


class User(BaseModel):
    name: str
    age: int
    note: str = Field(alias="sample")

メンバのnoteにはエイリアスでsampleという名前をつけています。

後ほど紹介するdictメソッドに関わってきます。

これをインスタンス化します。

from pydantic import BaseModel, Field


class User(BaseModel):
    name: str
    age: int
    note: str = Field(alias="sample")


user = User(name="taro", age=22, sample="備考")

noteはエイリアスでsampleになっているため、引数にもsample=””と記述します。

dictメソッドを使う

この状態でdictメソッドを使ってみます。

from pydantic import BaseModel, Field


class User(BaseModel):
    name: str
    age: int
    note: str = Field(alias="sample")


user = User(name="taro", age=22, sample="備考")

print(user.dict())

# 結果: {'name': 'taro', 'age': 22, 'note': '備考'}

dictメソッドを使うとメンバ名: 値のkey: valueの形で出力されます。

この時、引数に何もつけないとnoteメンバはエイリアスではなくnoteで出力されます。

エイリアスのフィールド名を出力させたい時

エイリアスのフィールド名を出力させる時は引数にby_alias=Trueをつけます。

user = User(name="taro", age=22, sample="備考")

print(user.dict(by_alias=True))

# 結果: {'name': 'taro', 'age': 22, 'sample': '備考'}

こうするとnoteがエイリアスであるsampleになります。

出力させたい項目を指定する時

出力させたい項目を指定する場合はinclude={指定項目}をつけます。

user = User(name="taro", age=22, sample="備考")

print(user.dict(include={"name", "age"}))

# 結果: {'name': 'taro', 'age': 22}

includeにname, ageを指定しました。

出力結果にnoteメンバが表示されなくなりました。

出力したくない項目を指定する時

逆に出力したくない項目を指定する場合はexclude={指定項目}をつけます。

user = User(name="taro", age=22, sample="備考")

print(user.dict(exclude={"name", "age"}))

# 結果: {'note': '備考'}

excludeにname, ageを指定しました。

出力結果にはnoteメンバだけ表示されます。

まとめ

コードのまとめです。

なにかの役に立てば幸いです。

from pydantic import BaseModel, Field


class User(BaseModel):
    name: str
    age: int
    note: str = Field(alias="sample")


user = User(name="taro", age=22, sample="備考")

# 何も指定なし
print(user.dict())
# {'name': 'taro', 'age': 22, 'note': '備考'}

# エイリアス名で出力する
print(user.dict(by_alias=True))
# {'name': 'taro', 'age': 22, 'sample': '備考'}

# 出力する項目を指定する
print(user.dict(include={"name", "age"}))
# {'name': 'taro', 'age': 22}

# 出力しない項目を設定する
print(user.dict(exclude={"name", "age"}))
# {'note': '備考'}