Добавить в корзинуПозвонить
Найти в Дзене
Computer Pro

Дипломная Django. Корзина(basket, cart) добавление, чтение, удаление данных

По условиям задачи, корзиной нашего интернет-магазина могут пользоваться как авторизированные пользователи, так и неавторизированные пользователи. Надо подумать о модели корзины, что туда будет входить, какие нужны поля. И на основе этой модели уже будем строить представление, сериализаторы и конечные точки. Я было сначала подумал что "корзина" и "товары" в ней это всё должно быть в одном классе. Но потом пришел к выводу что "корзина" у пользователя может быть а товаров в ней может и не быть. Так что корзина (basket) отдельно а товары (items) в ней отдельно. На том и порешали, будет два класса в модели - Basket и BasketItems. Теперь подумаем над полями что будут заполнять эти два класса, по идее классу Basket было бы достаточно одного поля - user, связанного "один к одному" с конкретным пользователем. А потом думаю - пусть еще будет поле created_at, отвечающее за дату создания корзины. И вот что у меня нарисовалось: Соответственно товары в корзине, должны быть связаны с этой корзиной
Оглавление
Картинка для разбавления повествования. Фото моё.
Картинка для разбавления повествования. Фото моё.

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

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

Я было сначала подумал что "корзина" и "товары" в ней это всё должно быть в одном классе. Но потом пришел к выводу что "корзина" у пользователя может быть а товаров в ней может и не быть. Так что корзина (basket) отдельно а товары (items) в ней отдельно.

вот и переводчик так подумал
вот и переводчик так подумал

На том и порешали, будет два класса в модели - Basket и BasketItems. Теперь подумаем над полями что будут заполнять эти два класса, по идее классу Basket было бы достаточно одного поля - user, связанного "один к одному" с конкретным пользователем. А потом думаю - пусть еще будет поле created_at, отвечающее за дату создания корзины. И вот что у меня нарисовалось:

пришлось эту картинку переделать, поставил поле юзера - ForeignKey, а пока шел домой, размышлял и до меня дошло что я неправильно указал тип, надо было OneToOneField
пришлось эту картинку переделать, поставил поле юзера - ForeignKey, а пока шел домой, размышлял и до меня дошло что я неправильно указал тип, надо было OneToOneField

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

-4

Ну а далее, чтобы проверить как работает эта корзина и товары в ней, я открыл админку и добавил корзину и товары в базу данных. Да, само-собой я прописал необходимые поля (Basket и BasketItems) в админке, в файле admin.py

-5
Как видно, продукт связан с объектом корзины, что создана в верхнем скриншоте
Как видно, продукт связан с объектом корзины, что создана в верхнем скриншоте

Теперь дело за малым: прописать класс обработки корзины с товарами в представлении (views.py), сериализатор для преобразования данных в нужный нам формат, ну и подключить путь /api/baskets в файле urls.py

Сделаем сначала получение файлов в корзине. Для начала я сделаю только для зарегистрированных пользователей, а когда уже всё заработает (получение, добавление и удаление) можно будет сделать тоже самое и для анонимных пользователей.

1.GET

Итак, получаем queryset товаров в корзине, которая относится к пользователю из запроса, затем передаем его в сериализатор и получаем отформатированный вариант ответа.

-7

Делаем сериализатор, чтобы получить ответ как в swagger:

-8

Через class Meta подключаем модель корзины и берем из нее нужные поля, подключаем ProductSerializer, от которого будем наследовать все поля относящиеся к продукту. Переопределяем переменную "count", которая будет брать количество товаров (count) из корзины (BasketItem) и получаем вот такой сериализатор:

-9

Подключаем нужный нам url, заходим в корзину (продукт в колчичестве трех штук, я туда положил из админки) и видим результат - товар в корзине, в количестве 3 шт. с посчитанной суммой на странице магазина:

-10

2.POST

Данные о товарах в корзине получили, теперь попробуем какой нибудь товар занести в корзину. Посмотрим, что там по этому поводу говорит наш swagger:

-11
-12

Формат запроса, примерно такой же, только тут уже надо не получить, а отправить данные о товаре, в параметрах его id и количество товара.

Итак, нажимая на кнопку "Add to cart", вы посылаете запрос с данными из формы о том какой продукт вы хотите отправить в корзину и его количество.

-13

Ваш response содержит:

-14

Начинаем метод post с того что сохраним эти данные в переменных. Чтобы лучше укладывалось в голове я убрал из метода всё лишнее, оставил, так сказать идеальные условия - как будто, объект корзины никогда не создавался, товары туда не помещались, если удалить корзину, товары автоматически из нее удалятся:

-15
-16

И вот что получилось в коде:

-17

До нажатия на кнопку

-18

И после того как нажмешь

-19

Этот код написан для идеальных условий, просто демонстрирует работу добавление товара и его количества в корзину. Потом будет доработан. Остался последний метод для этой статьи - удаление.

3.DELETE

Удаление буду описывать так же на самом простом уровне, безо всяких условий, верней с минимальными условиями. Собственно все описал в комментариях к коду:

-20

Данный код может спокойно удалять объекты из корзины. Но сама корзина уже никуда не удаляется.

Вот собственно минимальный код, который обрабатывает "чтение, запись и удаление" данных из (в) корзины с товарами.

Завтра уже буду кумекать о том, как всё грамотно оформить, а так же чтобы анонимные пользователи тоже могли добавлять, удалять и читать товары из (в) корзины.