Задача курса
FastAPI: вложенная модель Pydantic и необязательное поле
Курс «FastAPI для начинающих: API с базой данных и тестами» · урок «Вложенные данные и необязательные поля»
Условие
Адрес и необязательный комментарий
Roomly принимает описания переговорных комнат, которые офис-менеджер отправляет, чтобы убедиться: сервис правильно понял полученные сведения и готов с ними работать. Каждое описание содержит адрес комнаты — не просто улицу или город по отдельности, а единую составную часть, объединяющую оба элемента вместе. Именно поэтому, если в адресе что-то пропущено, важно понимать не просто факт ошибки, а то, какой именно фрагмент составного адреса оказался неполным.
Помимо адреса, к переговорной можно приложить произвольный комментарий. Комментарий необязателен, и здесь возникает тонкость: офис-менеджер может не упомянуть его вовсе, может явно сообщить, что текста нет, а может передать конкретный текст. Все три варианта различаются по смыслу, и сервис должен их разграничивать, а не сводить к одному результату.
Когда описание принято успешно, Roomly возвращает подтверждение, в котором составной адрес сохранён в своём объединённом виде, а статус комментария отражает именно то, что было передано — не больше и не меньше. Ни само описание, ни комментарий нигде не оседают, существующие данные о комнатах остаются нетронутыми: задача сервиса на этом шаге — лишь принять, разобрать и честно отразить то, что пришло.
Что уже дано
Самостоятельный файл уже создаёт app и содержит основу RoomIn с ограничениями названия и вместимости. Дополните модель адресом и комментарием, затем добавьте маршрут. Кода прошлых обработчиков в файле нет.
Служебный переходник проверки запускается перед вашим файлом, но не создаёт приложение или данные. Менять его не нужно.
Что нужно сделать
Объявите модель Address с обязательными строками city и street. В RoomIn сохраните обязательные name длиной 2–50 символов и capacity от 1 до 50 включительно; добавьте обязательный address: Address и необязательный строковый comment, допускающий null и имеющий значение по умолчанию None.
Маршрут POST /api/rooms принимает RoomIn из JSON-тела. Успешный ответ со статусом 200 содержит ровно name, capacity, вложенный address с city и street, comment и булевый comment_provided. Последнее поле равно false, когда ключ comment отсутствовал, и true, когда он был передан — включая явный null. Сам comment отражает строку или null.
Обязательные поля и ограничения проверяются стандартной валидацией FastAPI. Ошибка во вложенном адресе даёт 422 с полным путём loc, например ["body", "address", "street"] при отсутствии улицы. Не сохраняйте данные и не обновляйте старые комментарии.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. После выполнения файла проверяющая система обращается к верхнеуровневому объекту app: служебный переходник отправляет HTTP-запросы через TestClient внутри процесса приложения и передаёт результаты скрытой проверке. Запускать Uvicorn или сетевой сервер не нужно.
Для POST /api/rooms с {"name": "Липа", "capacity": 4, "address": {"city": "Тула", "street": "Мира"}} ответ 200: {"name": "Липа", "capacity": 4, "address": {"city": "Тула", "street": "Мира"}, "comment": null, "comment_provided": false}. Если добавить в запрос "comment": null, в ответе меняется только comment_provided на true.
