📝 Fastapi

Pydantic v2 in FastAPI

P
Author
Pyland
📅
Published
30.06.2026
⏱️
Reading time
1 min
👁️
Views
84
🌿
Level
Medium

FastAPI uses Pydantic for data validation and serialization.

Basic models

from pydantic import BaseModel, Field
from datetime import datetime

class TaskCreate(BaseModel):
    title: str = Field(min_length=1, max_length=200)
    description: str | None = None
    priority: int = Field(default=1, ge=1, le=3)
    status: str = "todo"

class TaskResponse(BaseModel):
    id: int
    title: str
    status: str
    created_at: datetime

    model_config = {"from_attributes": True}  # for ORM compatibility

Using in FastAPI

@app.post("/tasks/", response_model=TaskResponse, status_code=201)
def create_task(task: TaskCreate):
    db_task = Task(**task.model_dump())
    db.add(db_task)
    db.commit()
    return db_task

Validators

from pydantic import field_validator, model_validator

class TaskCreate(BaseModel):
    title: str
    due_date: str | None = None

    @field_validator('title')
    @classmethod
    def title_not_empty(cls, v):
        if not v.strip():
            raise ValueError('Title cannot be empty')
        return v.strip()

    @model_validator(mode='after')
    def check_dates(self):
        # model-level validation
        return self

Computed fields

from pydantic import computed_field

class TaskResponse(BaseModel):
    title: str
    status: str

    @computed_field
    @property
    def is_done(self) -> bool:
        return self.status == 'done'

model_dump and model_validate

task = TaskCreate(title='Task', priority=2)

# To dict
task.model_dump()
# {'title': 'Task', 'description': None, 'priority': 2, 'status': 'todo'}

task.model_dump(exclude_none=True)
# {'title': 'Task', 'priority': 2, 'status': 'todo'}

# From dict
data = {'title': 'Task', 'priority': 3}
TaskCreate.model_validate(data)

Schemas for different operations

class TaskBase(BaseModel):
    title: str
    priority: int = 1

class TaskCreate(TaskBase):
    pass

class TaskUpdate(BaseModel):
    title: str | None = None
    priority: int | None = None
    status: str | None = None

class TaskResponse(TaskBase):
    id: int
    created_at: datetime
    model_config = {"from_attributes": True}

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

Middleware and CORS in FastAPI

Allows browser clients to make requests to an API from a different domain.

📅 30.06.2026 👁️ 90
📝

HTTPException in FastAPI

Охватываемые темы: Basic Usage, Status Codes, Error Details, Custom Headers.

📅 30.06.2026 👁️ 91
📝

Dependency Injection in FastAPI

Depends — FastAPI's dependency injection system for reusing code across endpoints.

📅 30.06.2026 👁️ 85

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!