はじめに
Pydanticは、Pythonのデータバリデーションライブラリで、型ヒントを使って自動的にデータの検証と変換を行います。この記事では、BaseModelの便利な機能を実例とともに紹介します。
1. 基本定義
最もシンプルな使い方から始めましょう。
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
主な特徴:
- 自動型チェック
- 自動型変換(例:
"123"→123)
user = User(name="太郎", age="25") # age は自動的に int に変換
print(user.age) # 25 (int型)
2. デフォルト値の設定
フィールドにデフォルト値を設定できます。
class User(BaseModel):
name: str = "Tom"
age: int = 20
user = User()
print(user.name) # "Tom"
print(user.age) # 20
3. Field によるバリデーション
Fieldを使うと、より詳細な検証ルールを設定できます。
from pydantic import BaseModel, Field
class User(BaseModel):
name: str = Field(..., description="ユーザー名")
age: int = Field(default=18, ge=0, le=120)
よく使うパラメータ:
| パラメータ | 説明 | 例 |
|---|---|---|
default |
デフォルト値 | default=18 |
... |
必須フィールド | Field(...) |
ge, le
|
以上、以下 | ge=0, le=120 |
gt, lt
|
より大きい、より小さい | gt=0, lt=100 |
min_length, max_length
|
文字列長 | min_length=3 |
description |
説明文 | description="年齢" |
example |
例 | example=25 |
alias |
別名 | alias="userName" |
user = User(name="花子", age=150) # ValueError: age must be <= 120
4. フィールドエイリアス(alias)
JSONのキャメルケースなど、異なる命名規則に対応できます。
class User(BaseModel):
user_name: str = Field(..., alias="userName")
user = User(userName="太郎") # エイリアスを使用
print(user.user_name) # "太郎"
5. 自動型変換
Pydanticの最大の魅力の一つです。
class User(BaseModel):
age: int
is_active: bool
user = User(age="30", is_active="yes")
print(user.age) # 30 (int)
print(user.is_active) # True (bool)
変換例:
-
"123"→123 -
"3.14"→3.14 -
"true","yes","1"→True
6. ネストしたモデル
モデルを入れ子にできます。
class Address(BaseModel):
city: str
postal_code: str
class User(BaseModel):
name: str
address: Address
user = User(
name="太郎",
address={"city": "東京", "postal_code": "100-0001"}
)
print(user.address.city) # "東京"
7. リストと辞書
コレクション型も簡単に扱えます。
class Group(BaseModel):
users: list[str]
settings: dict[str, int]
group = Group(
users=["太郎", "花子"],
settings={"max_users": 10, "timeout": 300}
)
8. オプショナルフィールド
Optionalを使うと、Noneを許可できます。
from typing import Optional
class User(BaseModel):
name: str
nickname: Optional[str] = None
user1 = User(name="太郎")
user2 = User(name="花子", nickname="はな")
Python 3.10+の場合:
nickname: str | None = None
9. カスタムバリデーター
独自の検証ロジックを追加できます。
from pydantic import BaseModel, field_validator
class User(BaseModel):
age: int
email: str
@field_validator("age")
def check_age(cls, v):
if v < 0:
raise ValueError("年齢は0以上である必要があります")
return v
@field_validator("email")
def check_email(cls, v):
if "@" not in v:
raise ValueError("有効なメールアドレスではありません")
return v
10. モデルの便利なメソッド
dict() - 辞書に変換
user = User(name="太郎", age=25)
print(user.dict()) # {"name": "太郎", "age": 25}
json() - JSON文字列に変換
print(user.json()) # '{"name": "太郎", "age": 25}'
model_dump() - v2での辞書変換
print(user.model_dump()) # Pydantic v2
11. 実践例:APIリクエストの検証
from pydantic import BaseModel, Field, field_validator
from typing import Optional
class CreateUserRequest(BaseModel):
username: str = Field(..., min_length=3, max_length=20)
email: str
age: int = Field(..., ge=18, le=100)
bio: Optional[str] = Field(None, max_length=500)
@field_validator("email")
def validate_email(cls, v):
if "@" not in v or "." not in v:
raise ValueError("有効なメールアドレスを入力してください")
return v.lower()
@field_validator("username")
def validate_username(cls, v):
if not v.isalnum():
raise ValueError("ユーザー名は英数字のみです")
return v
# 使用例
try:
request = CreateUserRequest(
username="taro123",
email="taro@example.com",
age=25,
bio="こんにちは"
)
print("リクエストは有効です:", request.dict())
except ValueError as e:
print("エラー:", e)
まとめ
PydanticのBaseModelを使うことで:
✅ 型安全なコードが書ける
✅ 自動的にデータを検証・変換できる
✅ コードの可読性が向上する
✅ バグを早期に発見できる
FastAPIなどのフレームワークと組み合わせることで、さらに強力なアプリケーションを構築できます。
参考リンク: