Первый работающий API

Query-параметры и фильтрация каталога

Содержание курса

Фильтр отсутствует, true или false

Чтобы фильтр был необязательным, аргументу задают значение по умолчанию. Для числового порога это выглядит так:

def list_rooms(min_capacity: int = 0):

Если ?min_capacity в запросе нет, FastAPI подставит 0, и условие capacity >= 0 пропустит все комнаты.

С булевым фильтром нужно различать три состояния: фильтр не передан, передан true и передан false. Значение 0 здесь не подойдёт — нужен None:

from typing import Optional

def list_rooms(min_capacity: int = 0, has_projector: Optional[bool] = None):

Optional[bool] означает, что аргумент может быть True, False или None. Именно = None определяет, что получит функция, если параметр не передан. Импорт Optional из typing обязателен для Python 3.8 и 3.9; начиная с 3.10 можно писать bool | None, но Optional работает везде.

Как FastAPI преобразует значения из строки:

  • ?has_projector=true → True
  • ?has_projector=false → False
  • ?has_projector=1 → True
  • ?has_projector=0 → False
  • параметр отсутствует → None

Если передать ?has_projector=maybe, FastAPI вернёт 422 ещё до вызова функции — строка maybe не является допустимым булевым значением.

Важно не путать это с обычным Python. Выражение bool("false") возвращает True, потому что непустая строка — истинна. FastAPI делает другое: он анализирует содержимое строки и преобразует её в настоящий True или False. Это разные механизмы, и полагаться на bool() вместо аннотации типа нельзя.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.