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() вместо аннотации типа нельзя.
