FastAPI для начинающих: API с базой данных и тестамиВходные данные и Pydantic v2Ограничения полей и ошибки валидации

Ограничения полей и ошибки валидации

Уроки курсаОграничения полей и ошибки валидации

В прошлом уроке модель RoomIn объявляла поля через простые аннотации: name: str и capacity: int. FastAPI проверял тип, но ничего не знал о допустимых значениях — вместимость 0 или имя из одного символа проходили без ошибки. Сейчас добавим правила прямо в объявление поля.

Field(...) как контракт: ge, le, min_length, max_length

Чтобы задать числовые или строковые ограничения, используют Field из pydantic. Выражение с Field записывают справа от =: оно описывает ограничения поля и, при необходимости, его значение по умолчанию. В показанном ниже Field(...) многоточие оставляет поле обязательным без значения по умолчанию.

Первый аргумент Field — это либо многоточие ..., либо конкретное значение по умолчанию. Многоточие означает «поле обязательно»: если клиент не передаст его в теле запроса, FastAPI вернёт 422 не выполняя обработчик.

Для числовых полей:

  • ge — значение должно быть больше или равно указанному;
  • le — меньше или равно;
  • gt и lt — строго больше и строго меньше.

Для строковых:

  • min_length — минимальная длина в символах Unicode;
  • max_length — максимальная.

Модель для переговорной выглядит так:

from pydantic import BaseModel, Field

class RoomIn(BaseModel):
    name: str = Field(..., min_length=2, max_length=50)
    capacity: int = Field(..., ge=1, le=50)

Теперь name обязана содержать от 2 до 50 символов, а capacity — целое число от 1 до 50 включительно. Правила проверяются до того, как управление дойдёт до функции-обработчика: если хотя бы одно нарушено, FastAPI отвечает 422.