pydantic
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePydantic v2
Pydantic v2
Pydantic v2 is the standard library for data validation, serialization, and settings management in Python. It uses type annotations to define data schemas and validates data at runtime with a high-performance Rust core.
Pydantic v2是Python中用于数据验证、序列化和配置管理的标准库。它使用类型注解定义数据模式,并通过高性能的Rust内核在运行时验证数据。
Model Basics
模型基础
Define models by subclassing . Use standard type annotations for fields and for metadata and constraints.
BaseModelField()python
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field
class User(BaseModel):
id: int
name: str = Field(min_length=1, max_length=100, description="Full name")
email: str
age: Optional[int] = Field(default=None, ge=0, le=150)
is_active: bool = True
created_at: datetime = Field(default_factory=datetime.utcnow)通过继承来定义模型。为字段使用标准类型注解,使用添加元数据和约束。
BaseModelField()python
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field
class User(BaseModel):
id: int
name: str = Field(min_length=1, max_length=100, description="Full name")
email: str
age: Optional[int] = Field(default=None, ge=0, le=150)
is_active: bool = True
created_at: datetime = Field(default_factory=datetime.utcnow)Field Basics
Field基础
- Required fields: declare with a type annotation and no default.
- Optional fields: use (or
Optional[T]) with a default ofT | None.None - Default values: assign a literal or use .
Field(default=...) - Default factories: use for mutable defaults.
Field(default_factory=callable)
- 必填字段:仅声明类型注解,不设置默认值。
- 可选字段:使用(或
Optional[T])并将默认值设为T | None。None - 默认值:直接赋值字面量或使用。
Field(default=...) - 默认工厂函数:使用为可变类型设置默认值。
Field(default_factory=callable)
Common Field()
Parameters
Field()常用Field()
参数
Field()| Parameter | Purpose |
|---|---|
| Static default value |
| Callable producing a default |
| Alternative name for parsing input |
| Human-readable title for JSON Schema |
| Field description for JSON Schema |
| Numeric constraints |
| String/collection length |
| Regex pattern for strings |
| Exclude from serialization |
| Make individual field immutable |
| 参数名称 | 用途 |
|---|---|
| 静态默认值 |
| 生成默认值的可调用函数 |
| 解析输入时使用的替代名称 |
| JSON Schema中的人类可读标题 |
| JSON Schema中的字段描述 |
| 数值约束 |
| 字符串/集合长度约束 |
| 字符串匹配的正则表达式 |
| 序列化时排除该字段 |
| 将单个字段设为不可变 |
Common Field Types and Constraints
常见字段类型与约束
Pydantic ships constrained types and special types for common patterns.
python
from pydantic import (
BaseModel,
EmailStr,
HttpUrl,
Field,
constr,
conint,
confloat,
conlist,
)
class Profile(BaseModel):
username: constr(min_length=3, max_length=30, pattern=r"^[a-zA-Z0-9_]+$")
email: EmailStr
website: HttpUrl | None = None
score: conint(ge=0, le=100) = 0
rating: confloat(ge=0.0, le=5.0) = 0.0
tags: conlist(str, min_length=1, max_length=10) = ["general"]Installto usepydantic[email].EmailStr
Pydantic内置了约束类型和用于常见场景的特殊类型。
python
from pydantic import (
BaseModel,
EmailStr,
HttpUrl,
Field,
constr,
conint,
confloat,
conlist,
)
class Profile(BaseModel):
username: constr(min_length=3, max_length=30, pattern=r"^[a-zA-Z0-9_]+$")
email: EmailStr
website: HttpUrl | None = None
score: conint(ge=0, le=100) = 0
rating: confloat(ge=0.0, le=5.0) = 0.0
tags: conlist(str, min_length=1, max_length=10) = ["general"]安装以使用pydantic[email]。EmailStr
Frequently Used Types
常用类型
- -- validated email address.
EmailStr - ,
HttpUrl-- validated URLs.AnyUrl - -- IPv4 or IPv6 address.
IPvAnyAddress - -- string hidden in repr and serialization.
SecretStr - ,
FilePath-- validated filesystem paths.DirectoryPath - ,
PastDatetime-- temporal constraints.FutureDatetime - ,
PositiveInt,NegativeInt-- numeric shortcuts.NonNegativeInt - -- UUID version 4.
UUID4 - -- parse a JSON string into type
Json[T].T
- -- 经过验证的电子邮箱地址。
EmailStr - ,
HttpUrl-- 经过验证的URL。AnyUrl - -- IPv4或IPv6地址。
IPvAnyAddress - -- 在repr和序列化中隐藏的字符串。
SecretStr - ,
FilePath-- 经过验证的文件系统路径。DirectoryPath - ,
PastDatetime-- 时间约束。FutureDatetime - ,
PositiveInt,NegativeInt-- 数值快捷类型。NonNegativeInt - -- 版本4的UUID。
UUID4 - -- 将JSON字符串解析为
Json[T]类型。T
Model Configuration
模型配置
Control model behavior with using .
model_configConfigDictpython
from pydantic import BaseModel, ConfigDict
class Item(BaseModel):
model_config = ConfigDict(
str_strip_whitespace=True,
frozen=False,
from_attributes=True,
populate_by_name=True,
use_enum_values=True,
validate_default=True,
strict=False,
json_schema_extra={"examples": [{"item_name": "Widget", "price": 9.99}]},
)
item_name: str = Field(alias="itemName")
price: float使用通过控制模型行为。
ConfigDictmodel_configpython
from pydantic import BaseModel, ConfigDict
class Item(BaseModel):
model_config = ConfigDict(
str_strip_whitespace=True,
frozen=False,
from_attributes=True,
populate_by_name=True,
use_enum_values=True,
validate_default=True,
strict=False,
json_schema_extra={"examples": [{"item_name": "Widget", "price": 9.99}]},
)
item_name: str = Field(alias="itemName")
price: floatKey Configuration Options
关键配置选项
| Option | Effect |
|---|---|
| Strip leading/trailing whitespace from strings |
| Make all fields immutable (model becomes hashable) |
| Allow initialization from ORM objects via attribute access |
| Accept both field name and alias during parsing |
| Store enum values instead of enum members |
| Run validators on default values |
| Disable type coercion globally |
| |
| Extend generated JSON Schema |
| 选项 | 效果 |
|---|---|
| 去除字符串首尾的空白字符 |
| 将所有字段设为不可变(模型变为可哈希) |
| 允许通过属性访问从ORM对象初始化模型 |
| 解析时同时接受字段名和别名 |
| 存储枚举值而非枚举成员 |
| 对默认值运行验证器 |
| 全局禁用类型转换 |
| 处理额外字段的方式: |
| 扩展生成的JSON Schema |
Validators
验证器
Field Validators
字段验证器
Apply validation logic to individual fields with .
@field_validatorpython
from pydantic import BaseModel, field_validator
class Signup(BaseModel):
username: str
password: str
@field_validator("username")
@classmethod
def username_must_be_alphanumeric(cls, v: str) -> str:
if not v.isalnum():
raise ValueError("must be alphanumeric")
return v.lower()
@field_validator("password", mode="after")
@classmethod
def password_strength(cls, v: str) -> str:
if len(v) < 8:
raise ValueError("must be at least 8 characters")
return v- -- run before Pydantic's own parsing (receives raw input).
mode="before" - (default) -- run after Pydantic parses and coerces the value.
mode="after" - Apply to multiple fields: .
@field_validator("field_a", "field_b")
使用为单个字段应用验证逻辑。
@field_validatorpython
from pydantic import BaseModel, field_validator
class Signup(BaseModel):
username: str
password: str
@field_validator("username")
@classmethod
def username_must_be_alphanumeric(cls, v: str) -> str:
if not v.isalnum():
raise ValueError("must be alphanumeric")
return v.lower()
@field_validator("password", mode="after")
@classmethod
def password_strength(cls, v: str) -> str:
if len(v) < 8:
raise ValueError("must be at least 8 characters")
return v- -- 在Pydantic自身解析之前运行(接收原始输入)。
mode="before" - (默认) -- 在Pydantic解析并转换值之后运行。
mode="after" - 应用于多个字段:。
@field_validator("field_a", "field_b")
Model Validators
模型验证器
Validate the entire model for cross-field logic with .
@model_validatorpython
from pydantic import BaseModel, model_validator
class DateRange(BaseModel):
start: datetime
end: datetime
@model_validator(mode="after")
def check_date_order(self) -> "DateRange":
if self.start >= self.end:
raise ValueError("start must be before end")
return self- -- receives raw input dict; useful for restructuring data.
mode="before" - -- receives the fully constructed model instance.
mode="after"
For advanced validator patterns including , , , custom types, and discriminated unions, consult the validators reference.
BeforeValidatorAfterValidatorWrapValidator使用验证整个模型的跨字段逻辑。
@model_validatorpython
from pydantic import BaseModel, model_validator
class DateRange(BaseModel):
start: datetime
end: datetime
@model_validator(mode="after")
def check_date_order(self) -> "DateRange":
if self.start >= self.end:
raise ValueError("start must be before end")
return self- -- 接收原始输入字典;适用于重构数据。
mode="before" - -- 接收完全构造的模型实例。
mode="after"
有关包括、、、自定义类型和鉴别联合在内的高级验证器模式,请参考验证器参考文档。
BeforeValidatorAfterValidatorWrapValidatorComputed Fields
计算字段
Derive fields from other values without storing them. Computed fields appear in serialization and JSON Schema.
python
from pydantic import BaseModel, computed_field
class Rectangle(BaseModel):
width: float
height: float
@computed_field
@property
def area(self) -> float:
return self.width * self.height从其他值派生字段而不存储它们。计算字段会出现在序列化结果和JSON Schema中。
python
from pydantic import BaseModel, computed_field
class Rectangle(BaseModel):
width: float
height: float
@computed_field
@property
def area(self) -> float:
return self.width * self.heightSerialization
序列化
model_dump()
model_dump()model_dump()
model_dump()Convert a model instance to a dictionary.
python
user = User(id=1, name="Ada", email="ada@example.com")
data = user.model_dump() # full dict
data = user.model_dump(exclude_none=True) # drop None values
data = user.model_dump(include={"id", "name"}) # only selected fields
data = user.model_dump(exclude={"created_at"}) # exclude fields
data = user.model_dump(by_alias=True) # use alias names as keys
data = user.model_dump(mode="json") # JSON-compatible types将模型实例转换为字典。
python
user = User(id=1, name="Ada", email="ada@example.com")
data = user.model_dump() # 完整字典
data = user.model_dump(exclude_none=True) # 移除None值
data = user.model_dump(include={"id", "name"}) # 仅包含指定字段
data = user.model_dump(exclude={"created_at"}) # 排除指定字段
data = user.model_dump(by_alias=True) # 使用别名作为键
data = user.model_dump(mode="json") # 转换为JSON兼容类型model_dump_json()
model_dump_json()model_dump_json()
model_dump_json()Serialize directly to a JSON string (faster than ).
json.dumps(model.model_dump())python
json_str = user.model_dump_json(indent=2, exclude_none=True)直接序列化为JSON字符串(比更快)。
json.dumps(model.model_dump())python
json_str = user.model_dump_json(indent=2, exclude_none=True)Serialization Aliases
序列化别名
Use to control output key names independently from parsing aliases.
serialization_aliaspython
class ApiResponse(BaseModel):
internal_id: int = Field(serialization_alias="id")
status_code: int = Field(serialization_alias="status")使用独立于解析别名控制输出键名。
serialization_aliaspython
class ApiResponse(BaseModel):
internal_id: int = Field(serialization_alias="id")
status_code: int = Field(serialization_alias="status")Custom Serializers
自定义序列化器
python
from pydantic import field_serializer
class Event(BaseModel):
timestamp: datetime
@field_serializer("timestamp")
def serialize_ts(self, v: datetime, _info) -> str:
return v.isoformat()python
from pydantic import field_serializer
class Event(BaseModel):
timestamp: datetime
@field_serializer("timestamp")
def serialize_ts(self, v: datetime, _info) -> str:
return v.isoformat()Deserialization
反序列化
From a Dictionary
从字典初始化
python
user = User.model_validate({"id": 1, "name": "Ada", "email": "ada@example.com"})python
user = User.model_validate({"id": 1, "name": "Ada", "email": "ada@example.com"})From a JSON String
从JSON字符串初始化
python
user = User.model_validate_json('{"id": 1, "name": "Ada", "email": "ada@example.com"}')python
user = User.model_validate_json('{"id": 1, "name": "Ada", "email": "ada@example.com"}')From ORM / Arbitrary Objects
从ORM/任意对象初始化
With in , initialize from objects with matching attributes.
from_attributes=Truemodel_configpython
class UserRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: str在中设置后,可以从具有匹配属性的对象初始化模型。
model_configfrom_attributes=Truepython
class UserRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: strsqlalchemy_user is an ORM instance
sqlalchemy_user是一个ORM实例
user_read = UserRead.model_validate(sqlalchemy_user)
undefineduser_read = UserRead.model_validate(sqlalchemy_user)
undefinedSettings Management
配置管理
Use to load configuration from environment variables, files, and other sources.
BaseSettings.envbash
pip install pydantic-settingspython
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
env_prefix="APP_",
env_nested_delimiter="__",
case_sensitive=False,
)
app_name: str = "My App"
debug: bool = False
database_url: str
redis_url: str = "redis://localhost:6379"
allowed_origins: list[str] = ["http://localhost:3000"]
settings = Settings()使用从环境变量、文件和其他来源加载配置。
BaseSettings.envbash
pip install pydantic-settingspython
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
env_prefix="APP_",
env_nested_delimiter="__",
case_sensitive=False,
)
app_name: str = "My App"
debug: bool = False
database_url: str
redis_url: str = "redis://localhost:6379"
allowed_origins: list[str] = ["http://localhost:3000"]
settings = Settings()Environment Variable Mapping
环境变量映射
With , the field maps to .
env_prefix="APP_"database_urlAPP_DATABASE_URL设置后,字段会映射到环境变量。
env_prefix="APP_"database_urlAPP_DATABASE_URLNested Settings
嵌套配置
Use to map nested models from flat environment variables.
env_nested_delimiterpython
class DatabaseSettings(BaseModel):
host: str = "localhost"
port: int = 5432
name: str = "mydb"
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_nested_delimiter="__")
db: DatabaseSettings = DatabaseSettings()Set and in the environment to override nested values.
DB__HOST=prod-dbDB__PORT=5433使用从扁平的环境变量映射嵌套模型。
env_nested_delimiterpython
class DatabaseSettings(BaseModel):
host: str = "localhost"
port: int = 5432
name: str = "mydb"
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_nested_delimiter="__")
db: DatabaseSettings = DatabaseSettings()在环境中设置和即可覆盖嵌套值。
DB__HOST=prod-dbDB__PORT=5433Secrets Directory
密钥目录
Load secrets from files (e.g., Docker secrets):
python
class Settings(BaseSettings):
model_config = SettingsConfigDict(secrets_dir="/run/secrets")
db_password: str从文件加载密钥(例如Docker密钥):
python
class Settings(BaseSettings):
model_config = SettingsConfigDict(secrets_dir="/run/secrets")
db_password: strModel Inheritance and Composition
模型继承与组合
Inheritance
继承
Share common fields across models with standard class inheritance.
python
class TimestampMixin(BaseModel):
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime | None = None
class UserCreate(TimestampMixin):
name: str
email: str
class UserUpdate(BaseModel):
name: str | None = None
email: str | None = None使用标准类继承在模型之间共享公共字段。
python
class TimestampMixin(BaseModel):
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime | None = None
class UserCreate(TimestampMixin):
name: str
email: str
class UserUpdate(BaseModel):
name: str | None = None
email: str | None = NoneComposition (Nested Models)
组合(嵌套模型)
Nest models for structured data. Pydantic validates nested objects recursively.
python
class Address(BaseModel):
street: str
city: str
country: str = "US"
class Company(BaseModel):
name: str
address: Address
employees: list["Employee"] = []
class Employee(BaseModel):
name: str
role: str
Company.model_rebuild() # resolve forward references使用嵌套模型处理结构化数据。Pydantic会递归验证嵌套对象。
python
class Address(BaseModel):
street: str
city: str
country: str = "US"
class Company(BaseModel):
name: str
address: Address
employees: list["Employee"] = []
class Employee(BaseModel):
name: str
role: str
Company.model_rebuild() # 解析前向引用Generic Models
泛型模型
Create reusable, type-parameterized models with .
Generic[T]python
from typing import Generic, TypeVar
from pydantic import BaseModel
T = TypeVar("T")
class PaginatedResponse(BaseModel, Generic[T]):
items: list[T]
total: int
page: int
per_page: int
has_next: bool
@computed_field
@property
def total_pages(self) -> int:
return (self.total + self.per_page - 1) // self.per_page使用创建可复用的类型参数化模型。
Generic[T]python
from typing import Generic, TypeVar
from pydantic import BaseModel
T = TypeVar("T")
class PaginatedResponse(BaseModel, Generic[T]):
items: list[T]
total: int
page: int
per_page: int
has_next: bool
@computed_field
@property
def total_pages(self) -> int:
return (self.total + self.per_page - 1) // self.per_pageConcrete usage
具体使用
class UserList(PaginatedResponse[User]):
pass
class UserList(PaginatedResponse[User]):
pass
Or inline
或内联使用
response = PaginatedResponse[User].model_validate(data)
Generic models generate accurate JSON Schemas per specialization, making them ideal for API response wrappers.response = PaginatedResponse[User].model_validate(data)
泛型模型会为每个特化生成准确的JSON Schema,非常适合作为API响应包装器。JSON Schema Generation
JSON Schema生成
Generate JSON Schema from any model for documentation, API specs, or frontend validation.
python
schema = User.model_json_schema()Customize with in or :
json_schema_extramodel_configField()python
class Product(BaseModel):
model_config = ConfigDict(
json_schema_extra={
"examples": [{"name": "Widget", "price": 9.99}]
}
)
name: str
price: float = Field(json_schema_extra={"examples": [9.99, 19.99]})For FastAPI request/response models, consult the skill.
fastapiFor advanced validator patterns, discriminated unions, recursive models, and custom types, consult the validators reference.
从任意模型生成JSON Schema,用于文档、API规范或前端验证。
python
schema = User.model_json_schema()可以在的或中自定义生成的Schema:
model_configjson_schema_extraField()python
class Product(BaseModel):
model_config = ConfigDict(
json_schema_extra={
"examples": [{"name": "Widget", "price": 9.99}]
}
)
name: str
price: float = Field(json_schema_extra={"examples": [9.99, 19.99]})有关FastAPI请求/响应模型的内容,请参考技能文档。
fastapi有关高级验证器模式、鉴别联合、递归模型和自定义类型的内容,请参考验证器参考文档。