What are Pydantic Models?
Pydantic models use Python type annotations to validate data. FastAPI uses them to automatically validate request and response data, generate documentation, and convert data types.
Basic Model
Create a simple model:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
description: str = None # Optional field
Field Validation
Add validation to fields:
from pydantic import BaseModel, Field
class User(BaseModel):
name: str = Field(..., min_length=1, max_length=100)
email: str = Field(..., regex=r'^[^@]+@[^@]+\.[^@]+$')
age: int = Field(..., ge=0, le=120) # Greater/less than or equal
Optional and Required Fields
Define optional fields:
from typing import Optional
class Item(BaseModel):
name: str # Required
price: float # Required
description: Optional[str] = None # Optional
tags: list[str] = [] # Default value
Using Models in Routes
Use models for request/response:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.post("/items/")
def create_item(item: Item): # Request body
return item # Response body
@app.get("/items/{item_id}", response_model=Item)
def get_item(item_id: int):
return Item(name="Product", price=19.99)
Nested Models
Use models within models:
class Address(BaseModel):
street: str
city: str
zip_code: str
class User(BaseModel):
name: str
email: str
address: Address # Nested model
Model Methods
Add methods to models:
class Item(BaseModel):
name: str
price: float
quantity: int = 1
@property
def total(self):
return self.price * self.quantity
def apply_discount(self, percent: float):
self.price *= (1 - percent / 100)
Best Practices
- Use type hints: Enable automatic validation
- Add validation: Use Field() for constraints
- Document models: Add docstrings for clarity
- Reuse models: Create base models for common fields
Next Steps
Learn about FastAPI routes or dependencies.