Python Pydantic Cheat Sheet
Defining BaseModel schemas, validators, field constraints, and serialization with Pydantic v2 for runtime data validation and settings.
2 PagesIntermediateFeb 12, 2026
Basic Models
Define fields with type hints; Pydantic validates and coerces on construction.
python
from pydantic import BaseModel, Fieldfrom typing import Optionalfrom datetime import datetimeclass User(BaseModel): id: int name: str email: str signup_date: datetime = Field(default_factory=datetime.utcnow) bio: Optional[str] = Noneuser = User(id=1, name="Alice", email="a@example.com")print(user.model_dump()) # dictprint(user.model_dump_json()) # JSON string
Field & Model Validators (v2)
field_validator and model_validator replace v1's @validator/@root_validator.
python
from pydantic import BaseModel, field_validator, model_validatorclass SignupForm(BaseModel): password: str confirm_password: str @field_validator("password") @classmethod def password_min_length(cls, v: str) -> str: if len(v) < 8: raise ValueError("password must be at least 8 characters") return v @model_validator(mode="after") def passwords_match(self): if self.password != self.confirm_password: raise ValueError("passwords do not match") return self
Field Constraints & Config
Constrain values inline and configure model-wide behavior.
python
from pydantic import BaseModel, Field, ConfigDictclass Product(BaseModel): model_config = ConfigDict(str_strip_whitespace=True, extra="forbid") name: str = Field(min_length=1, max_length=100) price: float = Field(gt=0, description="Price in USD") quantity: int = Field(ge=0, default=0) tags: list[str] = Field(default_factory=list, max_length=10)# extra="forbid" rejects unknown fields at construction time
Settings Management
pydantic-settings reads env vars / .env files into a typed model.
python
from pydantic_settings import BaseSettings, SettingsConfigDictclass Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_prefix="APP_") debug: bool = False database_url: str max_connections: int = 10settings = Settings() # reads APP_DEBUG, APP_DATABASE_URL, etc.
Error Handling & Types
Common patterns for catching and inspecting validation errors.
- ValidationError- raised on construction; e.errors() gives structured error list
- model_validate(obj)- validate a dict/object into a model instance
- model_validate_json(s)- validate directly from a JSON string
- TypeAdapter- validate non-BaseModel types like list[int] or dict[str, User]
- StrictStr / StrictInt- disable type coercion for a field (no '5' -> 5)
- Annotated[str, Field(...)]- preferred way to attach constraints in v2
Pro Tip
Use model_config = ConfigDict(extra='forbid') on any model that parses external input (API request bodies, config files) — silently ignoring unexpected fields hides typos and API drift that you'd otherwise catch immediately.
Was this cheat sheet helpful?
Explore Topics
#PythonPydantic#PythonPydanticCheatSheet#Programming#Intermediate#BasicModels#FieldModelValidatorsV2#FieldConstraintsConfig#SettingsManagement#CheatSheet#SkillVeris