今回は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': '備考'}