张芷铭的个人博客

Pydantic 基于类型注解实现数据验证,支持自动类型转换、序列化和结构化错误处理。

核心能力

能力说明
数据验证类型、格式、约束检查
自动转换JSON/dict → Python 类型
序列化模型 ↔ JSON/dict
错误处理结构化错误信息

基础用法

1
2
3
4
5
6
7
8
from pydantic import BaseModel, Field

class User(BaseModel):
    id: int
    name: str = Field(min_length=2, max_length=10)
    email: str | None = None

user = User(id="123", name="Alice")  # id 自动转 int

字段约束

1
2
3
4
class Product(BaseModel):
    name: str = Field(min_length=1, max_length=100)
    price: float = Field(ge=0, le=10000)  # 0 ≤ price ≤ 10000
    tags: list[str] = Field(default_factory=list)

自定义验证器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from pydantic import field_validator

class Product(BaseModel):
    price: float

    @field_validator("price")
    @classmethod
    def validate_price(cls, v):
        if v <= 0:
            raise ValueError("价格必须为正数")
        return v

嵌套模型

1
2
3
4
5
6
7
8
9
class Address(BaseModel):
    city: str
    street: str

class Company(BaseModel):
    name: str
    address: Address

company = Company(name="TechCorp", address={"city": "Beijing", "street": "Main St"})

FastAPI 集成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from fastapi import FastAPI

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/")
async def create_item(item: Item):
    return {"name": item.name, "price": item.price}

配置管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    api_key: str
    debug: bool = False

    class Config:
        env_file = ".env"

settings = Settings()

V2 新语法

1
2
3
4
5
6
7
# 序列化
user.model_dump()        # → dict
user.model_dump_json()   # → JSON string

# 反序列化
User.model_validate(data)          # dict → model
User.model_validate_json(json_str) # JSON → model

工具对比

工具优势适用场景
Pydantic类型注解集成、高性能API 验证、配置管理
Marshmallow灵活自定义 Schema复杂序列化
Dataclasses轻量级无需验证的简单结构

Comments