Домашнее задание
На основе полученных знаний, реализуйте подключение БД и напишите логику работы конечных точек в 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, Можно и так, но проще добавлять значение при создании товара. Добавил это уточнение в лекцию, спасибо!