Первый работающий 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=trueTrue
  • ?has_projector=falseFalse
  • ?has_projector=1True
  • ?has_projector=0False
  • параметр отсутствует → None

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

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