5.6 Написание запросов к БД используя SQLAlchemy, часть 1
6 из 6 шагов пройдено
1 из 1 баллa  получен

Метод изменения категорий

Так как в методе удаления категорий, мы не удаляли, а изменяли значение поля, код в методе изменений категорий будет очень похож. На данном этапе мы создадим нашу конечную точку, которая будет вносить изменения в существующие категории.

@router.put('/update_category')
async def update_category(db: Annotated[Session, Depends(get_db)], category_id: int, update_category: CreateCategory):
    category = db.scalar(select(Category).where(Category.id == category_id))
    if category is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail='There is no category found'
        )

    db.execute(update(Category).where(Category.id == category_id).values(
            name=update_category.name,
            slug=slugify(update_category.name),
            parent_id=update_category.parent_id))

    db.commit()
    return {
        'status_code': status.HTTP_200_OK,
        'transaction': 'Category update is successful'
    }

Разберем данный код подробно. Первым делом мы должны получить параметр category_id из запроса, а также получим нашу Pydantic модель в виде переменной update_category

Далее, по аналогии с удалением категорий, мы должны получить категорию с полученным category_id, и если ее не существует вызвать ошибку 404 с текстом 'There is no category found'. И уже после этой проверки, также через метод update в SQLAlchemy, изменяем значения полей, на значения из полученной Pydantic модели.

Запустим сервер и проверим работу. Так как в прошлом шаге мы удалили категорию, создадим еще одну.

И теперь попробуем изменить у нее значение:

Если мы откроем базу данных, то увидим что у нашей записи был успешно изменено значение parent_id, тем самым мы сделали категорию Macbook подкатегорией в категории Apple

Изменим значение is_active у категории Apple, чтобы она была снова активной.

И теперь если мы получим все категории, то увидим следующее:

На этом разработка конечных точек для категорий закончена. В следующем шаге попробуйте выполнить домашнее задание, по аналогии с этим разделом.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.

Далее, по аналогии с удалением категорий, мы должны получить категорию с полученным category_id, чтобы вызвать ошибку 404 с текстом 'There is no category found'.

Не нужно добавить, что то типа "В случае если такого нет", или я не верно понял?

@Алексей_Бойко, Спасибо, исправил.

Здравствуйте.

db.execute(update(Category).where(Category.id == category_id).values(name=update_category.name, parent_id=update_category.parent_id))

slug=slugify(update_category.name)) не надо добавить?

Или мы просто меняем категорию, на подкатегорию

@Николай_Баранов, Здравствуйте. Все верно говорите, не учел, что при изменении имени категории, необходимо также изменить ее слаг. Спасибо, поправил.