Короткий ответ
Pydantic-модель объявляется как параметр функции-обработчика; FastAPI разбирает JSON из тела запроса, проверяет его по полям и типам модели и при несоответствии возвращает 422 с описанием ошибок.
Как это работает подробнее
FastAPI видит, что параметр функции аннотирован типом, наследующим pydantic.BaseModel, и ожидает JSON-тело запроса. Pydantic парсит JSON, приводит типы (если возможно) и валидирует ограничения полей (например, min_length, gt).
Пример кода
example.py
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class ItemIn(BaseModel):
name: str = Field(min_length=1)
price: float = Field(gt=0)
@app.post("/items/")
def create_item(item: ItemIn):
return {"name": item.name, "price": item.price}
# POST {"name": "", "price": -1} -> 422, ошибки по обоим полямЧто использовать на практике
- Практика. Если валидация проходит, в функцию попадает уже готовый объект модели с типизированными атрибутами — не нужно вручную парсить
request.json(). Ошибки возвращаются в едином формате со списком некорректных полей и причин.
Подводные камни
- Риск. Делают поля модели опциональными без значения по умолчанию (
Optional[str]без= None), из-за чего поле остаётся обязательным; забывают, что Pydantic v1 и v2 различаются в именах методов (.dict()/.model_dump()).