В этом шаге мы переделаем функции отвечающие за PUT и DELETE запросы. Начнем с запросов на изменение данных.
@app.put("/message/{message_id}")
async def update_message(message_id: int, message: str = Body()) -> str:
edit_message = messages_db[message_id]
edit_message.text = message
return f"Message updated!"
Разберем данный код. Мы все также получаем message_id как тип int, и message как текст в теле запроса. Но так как у нас в БД(списке) находится следующее содержание:
{
"Messages": [
{
"id": 0,
"text": "Simple message"
},
{
"id": 1,
"text": "Simple message"
},
{
"id": 2,
"text": "Simple message"
},
{
"id": 3,
"text": "Simple message"
},
{
"id": 4,
"text": "Simple message"
}
]
}
Тут очень важно отметить, что у нас в списке не хранятся словари, в нем находится экземпляр класса Message созданный с помощью Pydantic. Первым делом мы получаем нужный элемент, используя срезы списка - messages_db[message_id]
И если мы попробуем узнать тип данных данного элемента, то получим:
type(messages_db[message_id]) # <class 'crud.Message'>
Теперь к полям данного экземпляра класса мы можем обращаться по его ключам, например .text или .id, что мы и делаем, записывая в поле этой модели значение переменной message, полученной из тела запроса.
Теперь осталось немного поправить функции удаления записей:
@app.delete("/message/{message_id}")
async def delete_message(message_id: int) -> str:
messages_db.pop(message_id)
return f"Message ID={message_id} deleted!"
@app.delete("/")
async def kill_message_all() -> str:
messages_db.clear()
return "All messages deleted!"
Единственное, что изменилось, если раньше message_id мы получали как строку, то теперь получаем как число.
На этом рассмотрение основ моделей мы заканчиваем, в следующем разделе мы познакомимся ответами, моделированием ответов и обработкой ошибок в FastAPI.
пфах, долго не мог переварить...
как обращаясь вот так:
edit_message = messages_db[message_id]вот сюда:
{ "Messages": [ { "id": 0, "text": "Simple message" }, ...],мы получаем хоть что-то?
Затем осознал, что неверно понимал контекст, т.к пример иллюстрирует, отдаваемые нам методом GET данные, а не нашу оригинальную БД.
p/s но тип "вшитых" так и остался <dict>, а вот созданных с API <crud.Message>, по крайней мере внутри crud.py/
@Denis_Romanov, функция
@app.get("/message/{message_id}") async def get_message(message_id: int): return messages_db[message_id]возвращает объект класса Message по индексу. ИМХО костыльно, но нам это только для примера нужно.