Задача курса

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.

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется