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}
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!