logo

Optional and Default Values

Not every field needs a value. Use Optional for fields that can be None, or provide default values.

from pydantic import BaseModel
from typing import Optional

class User(BaseModel):
    name: str
    email: Optional[str] = None
    active: bool = True

Now email and active are optional:

user = User(name="Alice")
print(user.email)   # None
print(user.active)  # True

Fields with defaults must come after required fields - just like function arguments.

For computed defaults (like timestamps), use Field:

from pydantic import Field
from datetime import datetime

class Post(BaseModel):
    title: str
    created_at: datetime = Field(default_factory=datetime.now)

default_factory calls the function each time, giving you a fresh value.

I cover default patterns in my Pydantic course.