У меня есть вот такая структура бд для реализации различных комбинаций продуктов:
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-й атрибут. Вот как это выглядит:
Зайдя на страницу товара я перечисляю все имеющиеся цвета и размеры данного продукта (например, беру из таблицы variation только те у которых подходящий product_id и смотрю размеры и цвета, сджоинив с color или size).
До добавления вариаций хранил продукты в корзине в сессии в таком вот виде:
"cart": {
"product_id": {
"quantity": 123,
},
"another_product_id": {
"quantity": 456,
}
}
Вопрос:
1) Как мне переделать корзину, чтоб я мог хранить продукты с разными комбинациями атрибутов (размеров, цветов) как отдельные элементы корзины?
Вот, например, тут добавлен один и тот же товар с 3-мя разными размерами. И каждый размер это отдельный айтем в корзине (тут пример без колонки цвета):
2) Если пользователь выбирает размер 44, а цвет синий, но у меня в базе нет такой комбинации, то что делать?
Я перерыл весь интернет, но так и не нашел нормального объяснения как спроектировать корзину в сессии для таких случаев