1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pydantic BaseModel 完全ガイド

1
Posted at

はじめに

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などのフレームワークと組み合わせることで、さらに強力なアプリケーションを構築できます。

参考リンク:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?