Как правильно реализовать вариации товаров Django?

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

62ac4e87eec55189247001.png

Python код:

class Product(models.Model):
    name = models.CharField(max_length=150)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class Size(models.Model):
    value = models.CharField(max_length=20)

class Color(models.Model):
    value = models.CharField(max_length=20)

class Variation(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="variations")
    size = models.ForeignKey(Size, on_delete=models.CASCADE)
    color = models.ForeignKey(Color, on_delete=models.CASCADE)



Мы можем зайти страницу редактирования продукта и добавить различные варианты этого продукта, создавая комбинации, напр, размер 40 цвет красный, размер 42 цвет красный и т. д. Таким образом будет заполнятся промежуточная таблица variation. В будущем в нее можно будет добавить колонку цены, чтобы у разных вариантов была своя цена или добавить к цвету и размеру еще и 3-й атрибут. Вот как это выглядит:

62ac51dc9c3f5345263088.png

Зайдя на страницу товара я перечисляю все имеющиеся цвета и размеры данного продукта (например, беру из таблицы variation только те у которых подходящий product_id и смотрю размеры и цвета, сджоинив с color или size).
62ac4f21b9a28196965355.png

До добавления вариаций хранил продукты в корзине в сессии в таком вот виде:

"cart": {
    "product_id": {
        "quantity": 123,
    },
    "another_product_id": {
        "quantity": 456,
    }
}


Вопрос:
1) Как мне переделать корзину, чтоб я мог хранить продукты с разными комбинациями атрибутов (размеров, цветов) как отдельные элементы корзины?
Вот, например, тут добавлен один и тот же товар с 3-мя разными размерами. И каждый размер это отдельный айтем в корзине (тут пример без колонки цвета):
62ac514e50206584423543.png

2) Если пользователь выбирает размер 44, а цвет синий, но у меня в базе нет такой комбинации, то что делать?

Я перерыл весь интернет, но так и не нашел нормального объяснения как спроектировать корзину в сессии для таких случаев
  • Вопрос задан
  • 753 просмотра
Решения вопроса 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
"cart": {
    "variation.id": {
        "quantity": 123,
    },
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы