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

Домашнее задание

На основе полученных знаний, реализуйте подключение БД и напишите логику работы конечных точек в  products.py

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

 

Создание товаров (create_product).

Используя зависимости сессий БД, выполните запрос создания товаров, получите товар на основании Pydantic модели CreateProduct. Для заполнения поля slug, используйте slugify, а для заполнения поля rating используйте значение 0.0. 

В случае успешного добавления, верните следующий ответ:

'status_code': status.HTTP_201_CREATED,
'transaction': 'Successful'

 

Получение товаров (all_products).

Напишите код конечной точки, выводящей все товары из нашей базы данных. Фильтруя результаты по полю is_active=True и stock > 0. В случае если товары не найдены, вызовите ошибку 404 с текстом "There are no product"

 

Получение товаров (product_by_category).

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

Первым делом нам нужно проверить наличие данной категории, в случае отсутствия вызвать ошибку 404 с текстом "Category not found".

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

subcategories = db.scalars(select(Category).where(Category.parent_id == category.id)).all()

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

И в заключении мы выполняем запрос, где фильтруем наш товар через метод IN,  а также получаем только активные товары (is_active == True) с остатком более 0 (stock > 0).

В результате выводим полученные товары из БД.

 

Детальный вывод товара (product_detail)

Получая product_slug из параметра пути, реализуйте конечную точку получения одного товара. В случае если товар не найден, вызовите ошибку 404 с текстом "There are no product"

 

Изменение товара (update_product)

Получая product_slug из параметра пути и на основании Pydantic модели CreateProduct, реализуйте конечную точку изменения одного товара. Поле slug трогать не нужно, его значение не должно изменяться.

В случае если товар не найден, вызовите ошибку 404 с текстом "There is no product found"

В случае успешного изменения, верните следующий ответ:

        'status_code': status.HTTP_200_OK,
        'transaction': 'Product update is successful'

 

Удаление товара (delete_product)

Получая product_slug из параметра пути, реализуйте конечную точку изменения одного товара. Необходимо реализовать ее так же как и с категориями, то есть изменяя поле is_active на False.

В случае если товар не найден, вызовите ошибку 404 с текстом "There is no product found"

В случае успешного изменения, верните следующий ответ:

        'status_code': status.HTTP_200_OK,
        'transaction': 'Product delete is successful'

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

возникло недопонимание с полем `rating` модели `Product`.
В схеме pydantic мы его не ожидаем, а в модели значение по умолчанию не объявили. Пришлось хардкодить.
Уточните, плиз, требование к нему.

@Denis_Romanov, Мы это поле будем заполнять на основании средней оценки отзыва пользователя о товаре. Не совсем логично при создании товара назначать его рейтинг.

@Denis_Romanov, Это часть экзамена - https://stepik.org/lesson/1225085/step/6?unit=1238576

@Илья_Перминов, выходит, нужно в модели Product для поля rating дописать default=0?

@Anonymous_38661511, Можно и так, но проще добавлять значение при создании товара. Добавил это уточнение в лекцию, спасибо!

Доброго времени суток, коллеги!

subcategories = db.scalars(select(Category).where(Category.parent_id == category.id)).all()

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

Возможно я не правильно понял, тогда прошу меня простить и поправить =) но получить список с ID подкатегорий можно получить если мы напишем так: 

subcategories = db.scalars(select(Category.id).where(Category.parent_id == main_category.id or Category.id == main_category.id)).all()

@Алексей_Бойко, да, вполне можно так. Я писал чтобы максимально упростить запросы. Только не совсем понял этой части вашего кода or Category.id == main_category.id

@Илья_Перминов,  оу, у меня просто переменные чуть по другому называются, спасибо!