Pydantic Basics
9 examples for Pydantic 2 models - 6 basic and 3 intermediate.
Search across all documentation pages
9 examples for Pydantic 2 models - 6 basic and 3 intermediate.
uv pip install "pydantic>=2" pydantic-settingsTyped data container with validation.
from pydantic import BaseModel
class User(BaseModel):
id: int
name: strRelated: Field Types & Constraints - Field()
Catch bad input.
from pydantic import BaseModel, ValidationError
class Age(BaseModel):
years: int
try:
Age(years="x")
except ValidationError as e:
print(e.error_count())Optional fields and factories.
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str
tags: list[str] = Field(default_factory=list)T | None.Serialize to dict/JSON-friendly data.
user = User(id=1, name="Ada")
user.model_dump()
user.model_dump(mode="json")Related: Serialization - advanced dumps
Compose structures.
class Address(BaseModel):
city: str
class Profile(BaseModel):
address: AddressRelated: Nested & Recursive Models - trees
Model-wide behavior.
from pydantic import BaseModel, ConfigDict
class Strict(BaseModel):
model_config = ConfigDict(extra="forbid", str_strip_whitespace=True)Field-level custom checks.
from pydantic import BaseModel, field_validator
class EmailUser(BaseModel):
email: str
@field_validator("email")
@classmethod
def must_have_at(cls, v: str) -> str:
if "@" not in v:
raise ValueError("invalid email")
return v.lower()Related: Validators - model validators
Cross-field rules.
from pydantic import BaseModel, model_validator
class Range(BaseModel):
low: int
high: int
@model_validator(mode="after")
def check_order(self):
if self.high < self.low:
raise ValueError("high < low")
return selfGenerate schema for docs.
User.model_json_schema()Related: Serialization - schema export
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 19, 2026