PRO

Как реализовать валидацию входных данных через Pydantic?

Для валидации тела запроса в FastAPI создают Pydantic-модель, наследуя её от BaseModel, и указывают её типом параметра endpoint. FastAPI проверяет обязательные поля, типы, ограничения и возвращает ответ с ошибкой валидации, если данные не соответствуют схеме.
Подробный ответ

Базовая Pydantic-модель

Pydantic-модель описывает контракт входящих данных через типы Python. FastAPI читает эту схему, получает JSON из тела запроса, проверяет его и передаёт в endpoint уже валидированный объект.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class ArticleCreate(BaseModel):
    title: str
    text: str
    is_published: bool = False


@app.post('/articles')
def create_article(article: ArticleCreate):
    return article

Ограничения полей

Для строк, чисел и других типов можно задавать дополнительные правила через Field. Например, ограничить длину заголовка или минимальное значение цены.

from pydantic import BaseModel, Field


class ProductCreate(BaseModel):
    title: str = Field(min_length=3, max_length=200)
    price: float = Field(gt=0)
    quantity: int = Field(ge=0)

Собственная проверка

Если правило зависит от нескольких полей или не выражается обычным ограничением, добавляют Pydantic validator.

from pydantic import BaseModel, field_validator


class UserCreate(BaseModel):
    password: str

    @field_validator('password')
    @classmethod
    def validate_password(cls, value: str) -> str:
        if len(value) < 8:
            raise ValueError('Password must contain at least 8 characters')
        return value

Что происходит при ошибке

Если обязательного поля нет, тип значения не совпадает или правило нарушено, FastAPI автоматически возвращает клиенту ответ с деталями ошибки. Не нужно вручную писать проверку каждого поля в endpoint.

Разделение схем

На практике удобно создавать разные схемы для создания, обновления и ответа. Например, в UserCreate может быть пароль, но в UserRead пароль возвращать нельзя.

Как ответить на собеседовании

Я описываю входные данные Pydantic-моделью на основе BaseModel и передаю её в endpoint как тип параметра. Для ограничений использую Field, а для сложных правил — validators. FastAPI сам валидирует запрос и возвращает структурированную ошибку, если схема не проходит проверку.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге