はじめに
先日Pydantic v2で新しく導入されたComputed Fieldsを初めて使いました。
日本語の記事があまりなかったので紹介します。
Computed Fieldsとは
Computed Fieldsとは、モデルのデータを計算したフィールドです。
データベースには保存されていないデータを、APIのレスポンスやオブジェクトのプロパティとして使用できます。
基本的な例
以下は公式サイトのサンプルです。
area
はデータベースには含まれませんが、オブジェクトのプロパティには含まれています。
from pydantic import BaseModel, computed_field
class Rectangle(BaseModel):
width: int
length: int
@computed_field
@property
def area(self) -> int:
return self.width * self.length
print(Rectangle(width=3, length=2).model_dump())
#> {'width': 3, 'length': 2, 'area': 6}
APIでの使用例
FastAPIの内部ではPydanticが使われているので、FastAPIでcomputed_fieldを使うことで、フロント側で簡単に計算結果を取得できます。
Pydantic v2に対応しているのはFastAPI 0.100.0以降の場合のみです
具体例として、以下のサンプルプログラムをChatGPTに生成してもらいました1。
from fastapi import FastAPI
from pydantic import BaseModel, computed_field
app = FastAPI()
class ProductModel(BaseModel):
name: str
price: float
tax_rate: float = 0.1 # 税率デフォルト 10%
@computed_field
@property
def price_with_tax(self) -> float:
return self.price * (1 + self.tax_rate)
@app.get("/product")
def get_product():
product = ProductModel(name="Laptop", price=1000.0)
return product
GET /product
をすると以下のJSONが返ります。
price_with_tax
はデータベースには含まれませんが、APIのレスポンスには含まれています。
{
"name": "Laptop",
"price": 1000.0,
"tax_rate": 0.1,
"price_with_tax": 1100.0
}
レスポンスとしてProductModel
型のデータを返すとき、price_with_tax
も返ってくるので、フロント側でいちいち計算する手間が省けます。
おわりに
Computed Fields、めちゃくちゃ便利です。
参考
-
本筋とは無関係ですが、税率は別途定数の設定ファイルに記載した方がいいと思います ↩