Schemas
Pydantic models and data validation for the FastAPI Boilerplate.
Base Schema
Common Fields
from pydantic import BaseModel
from datetime import datetime
from typing import Optional
class BaseSchema(BaseModel):
id: int
created_at: datetime
updated_at: datetime
class Config:
orm_mode = True
User Schemas
User Models
from pydantic import BaseModel, EmailStr, constr
from typing import Optional
class UserBase(BaseModel):
email: EmailStr
full_name: Optional[str] = None
class UserCreate(UserBase):
password: constr(min_length=8)
class UserUpdate(UserBase):
password: Optional[constr(min_length=8)] = None
class UserInDB(UserBase):
id: int
is_active: bool
is_superuser: bool
hashed_password: str
class UserResponse(UserBase):
id: int
is_active: bool
is_superuser: bool
class Config:
orm_mode = True
Post Schemas
Post Models
from pydantic import BaseModel
from typing import Optional
from app.schemas.user import UserResponse
class PostBase(BaseModel):
title: str
content: Optional[str] = None
class PostCreate(PostBase):
pass
class PostUpdate(PostBase):
pass
class PostResponse(PostBase):
id: int
author_id: int
author: UserResponse
class Config:
orm_mode = True
Token Schemas
Authentication Models
from pydantic import BaseModel
class Token(BaseModel):
access_token: str
token_type: str
class TokenPayload(BaseModel):
sub: str
exp: int
Data Validation
Custom Validators
from pydantic import BaseModel, validator
import re
class UserCreate(BaseModel):
email: str
password: str
@validator('password')
def password_strength(cls, v):
if len(v) < 8:
raise ValueError('Password must be at least 8 characters')
if not re.search(r'[A-Z]', v):
raise ValueError('Password must contain at least one uppercase letter')
if not re.search(r'[a-z]', v):
raise ValueError('Password must contain at least one lowercase letter')
if not re.search(r'[0-9]', v):
raise ValueError('Password must contain at least one number')
return v
@validator('email')
def email_format(cls, v):
if not re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', v):
raise ValueError('Invalid email format')
return v