3.2 Модели Pydantic и их валидация
7 из 7 шагов пройдено
5 из 5 баллов  получено

В этом шаге мы переделаем функции отвечающие за 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

@Denis_Romanov, функция 

@app.get("/message/{message_id}")
async def get_message(message_id: int):
    return messages_db[message_id]

 возвращает объект класса Message по индексу. ИМХО костыльно, но нам это только для примера нужно.