• Как правильно сделать initialState в redux?

    @mr_drinkens89 Автор вопроса
    Благодарю.
    Не совсем только понимаю)
    у меня три редьюсера, которые я выношу в combine.
    Как я понимаю, каждый редьюсер в combine создает именованный объект.
    То есть надо создать отдельный initialReducer, где через АПИ подгрузить данные и заполнить store?
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: Протестировал с группировкой цветов в шаблоне (через regroup). В принципе, работает довольно-таки быстро, и логика более прозрачная. Мы не задумываемся над тем, как группировать по цветам и их размерам в цвете во вьюхе, а передаем всю эту логику "клиентской" части. Во вьюхе логика проста до безумия - берем только "виртуальные товары" из данной категории, и все)
    Насколько это практично - точно не знаю, но, данное решение тоже имеет место).
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x:

    Уточнение - цвета и азмеры нужно свзяать между собой.
    Пример: выбрали цвет = показало доступные размеры
    Да/нет?

    Да. В каталоге, когда идет список "виртуальных" товаров, именно так и происходит: выбираем цвет - показ размеров для данного цвета. Но, если можно тупо группировкой это сделать - то тоже рабочий вариант (как я описал выше).
    Пример: (начальное значение): показ "красного" цвета - выводим только размеры для красного (41, 42).
    Жмем на "зеленый" - показ размеров только для зеленого набора (43, 45).
    причем, цвет - кликабелен (ссылка), а вот размеры - чисто информационные данные.


    Зачем цвет делать куском фотки, если он по моей задумке должен быть общий для многих ВариантовТоваров?


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

    Кратко подытожу:
    1. Приходят только товары, которые содержат в себе размер.
    Вот пример, что приходит в файле:
    Название: джинсы гуччи
    Размер: 43
    Цвет: Красный
    Артикул: 55555
    
    Название: Джинсы Гуччи
    Размер: 45
    Цвет: Красный
    Артикул: 55555
    
    Название: Джинсы гуччи
    Размер: 43
    Цвет: Зеленый
    Артикул: 55555


    2. Понятно, что было бы проще, если б мы просто показывали все эти товары, как индивидуальные карточки. Но, это не совсем корректно). Именно поэтому и делается "группировка" товаров по их артикулу (общий товар) и по цветам.
    3. Необходимо объединять товары по цветам
    4. Каждый набор цветов (например, красный) должен содержать в себе набор размеров для данного цвета
    5. Приходят фотографии, которые мы должны привязать по штрихкоду. Фотографии для товара одинаковы в рамках одного цвета.
    6. Необходимо делать как можно меньше запросов к БД, так как при большом количестве запросов, время ожидания для юзера будет слишком большим, и он тупо уйдет с магазина))
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: подправил схему.
    Получил такой вариант:
    КатегорияТовара (MPTT)
      название = (джинса, футболка, ...)
    
    Бренд
      Название бренда
      
    Товар
      категория = m2m(КатегорияТовара) (один товар может находиться в несколькоих категориях - по дереву)
      бренд = FK(Бренд)
    
    ФотоТовара
      фото = imageField
    
    Цвет:
      imagePreview = imageField (берем "кусочек" фотки как цвет. При наведении - выводим title, например, красный)
      название
    
    ВариантТовара
      артикул
      цена
      размер
      товар = FK(Товар,related_name="variants")
      фотки = m2m (фотоТовара)
      цвет = FK(Цвет) (цвет может быть только один у варианта)
    
    views.py:
    
    (берем slug категории)
    category = КатегорияТовара.objects.get(slug=slug)
    vProducts = Product.objects.filter(category=category).prefetch_related("variants","variants__color","variants__images")
    
    рендер в шаблон vProducts - все "виртуальные товары" для данной категории (со всеми его вариантами). Одновременно, варианты тащат за собой цвета и фотки в одном запросе.
    
    В шаблоне:
    
    - в цикле проходим по всем "виртуальным товарам" (имеем пустую "карточку" - заготовку, контейнер)
    - через regroup делаем нужный нам вид (группировка по цветам)

    Вариант через regroup:
    1. Группируем в шаблоне по цвету
    2. Выводим список grouper - это наши цвета (синий, зеленый, красный)
    3. Выводим слева список размеров для первого цвета (допустим, синий: 41,42,45).
    4. Фотки - выводим фотографии для первого варианта из цвета.
    5. Ну и при смене цвета - аяксом меняем: фотографии (новый набор из нажатого цвета), и размеры - это уже отдельная логика, но, уже не такая мудреная, так как данные манипуляции можно сделать во view и кинуть их через json. Набор цветов мы формируем всего один раз - при начально инициализации, так как данный набор не меняется. По сути, именно этот набор и меняем весь вид карточки в каталоге (от цвета зависит и набор фоток, и набор размеров).

    {% regroup product.variants.all by color as colors %}
    <p>Цвета</p>
    {% for color in colors %}
    	{{ color.grouper }}
    {% endfor %}
    
    <p>Размеры первого цвета</p>
    {% with colors|first as firstElements %}
    	{% for variant in firstElements.list %}
    		<b>{{ variant.size }}</b>
    	{% endfor %}
    {% endwith %}


    Протестировал на одном товаре - пока все верно выводит, и запросов всего 3 на каждую карточку.
    Единственное, при первом старте будут дополнительные запросы к sorl-thumbnail, так как превью еще не созданы и их нет в кеше. После первого старта, sorl-thumbnail будет тащить фотки с кеша, что также уменьшит количество обращений к БД.
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: Тогда, ситуация: показ всех товаров из категории "Джинсы" (упрощенный вариант, без пагинации и прочего)
    category = Category.objects.get(slug=slug)
    products = Product.objects.filter(category=category).prefetch_related("variants").all()
    return render(request,template,locals())


    в шаблоне:
    {% for virtual in products %}
    {% with virtual.variants.all|first as firstProduct %}
     #выводим фотки товара в цикле
     #выводим основную инфу товара
     ? как выводить цвета? (или же просто брать первый товар из любого цвета?)
    {% endwith %}
    
    {% endfor %}


    Не будет ли слишком много запросов? Ведь, насколько я понял, мы выводим (собираем) только виртуальные товары из данной категории, а "реальные" уже "подтаскиваем" с помощью запросов.
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x:
    И после сгруппировать?)
    Я думал, что ВариантТовар содержит в себе только один размер.
    То есть:
    ВариантТовар красный 41 размер
    ВариантТовар красный 42 размер
    ВариантТовар синий 43 размер

    Таки полностью достаточно, грубя говоря, двух основных моделей Товар и ТоварВариант? И сопутствующих с ними Фото, Категория...?
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: Благодарю)
    Буду переделывать свою схему, под новые условия).
    (не вижу в тостере, где кнопка "отметить, как решение", вроде, раньше было))
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: на сайте все равно нужен и поиск, и фильтрация. Дабы БД каждый раз не дергать, можно запихать все свойства для фильтрации (цвет, размер, бренд, категория, цена) в индекс. Тогда, думаю, быстродействие увеличится.
    Да, именно коллекцию. Необходимо в каталоге, показать всю инфу о товаре: сколько есть цветов, сколько размеров у конкретного цвета и фотографии (прикрепил фото)
    68e0ed47934647e88c357cec547b8bd8.png
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: Структуру понял)
    Получается, что для фильтрации товаров по свойствам и для поиска, через haystack+elasticsearch, в индекс пойдут "ВариантТовара", а вот уже на "выдаче", мы должны пройтись по всем выданным haystack товарам, и "вытащить" из них "Товар". Верно?
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: Супер)
    Еще необходимо только добавить модель ProductImage, и связывать фотки со цветами.
    ТипТовара
      название = (джинса, футболка, ...)
    
    Коллекция
      марка
      
    Товар
      коллекция = FK(Коллекция)
      тип_товара = FK(ТипТовара)
    
    ФотоТовара
      фото = imageField
    
    ВариантТовара
      артикул
      товар = FK(Товар)
      фотки = m2m (фотоТовара)
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: да, в категории у меня как раз и используется MPTT для показа "дерева".
    Обычно, были типичные магазины, в которых только: категория-товар (например, это для магазина электроники подходит).
    для магазина одежды структура уже меняется: необходимо "объединять" товары по их цветам.
    Я представляю себе это так: "коробка". В ней товары, допустим 9 джинс трех цветов: желтый, синий, красный.
    То есть первая абстракция: "коробка", на которой обычно пишут всю инфу о товарах (сколько цветов, сколько размеров)
    Вторая: цвета. В нашем случае их три: желтый, синий, красный.
    Ну и третья - уже по размерам для цвета.

    Да, так реально можно запутаться, если тупо идти по дереву, куда проще создавать отдельные модели)
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: Правильно ли я понимаю, что будет основных три модели: категория, товар, вариантТовара
    class Category(MpttModel):
        name = models.CharField('name')
        .....
    
    class Product(models.Model):
        category = models.ForeignKey(Category)
        brend
    
    class ProductVariant(models.Model):
        sku
        product = models.ForeignKey(Product)
        color
        size 
        price 
    .....


    То есть "дерево", как таковое через MPTT в Product и не нужна вовсе?
    спасибо
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: да, товар же может быть в разных категориях (одежда-джинсы-классические джинсы).
    вообще, приходит xls файл, с товарами по типу "Размер 55, цвет Красный, артикул 444444, название).
    Далее, для удобства редактирования в админке, так и для вывода карточки в категории, я создаю 2 виртуальных товара. Первый - содержит в себе все цвета, а второй - все размеры для данного цвета.
    То есть мне необходимо отобразить сразу всю инфу в одной карточке: сколько есть цветов, сколько размеров для каждого цвета.
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: categories - для связи с категориями. То есть чтобы получить товары для нужной категории, вызываю как product_set....
    Проблема в том, что мне всегда необходимо делать запрос (get_root(), например), чтобы дойти до конкретного родителя в дереве, а хотелось бы, чтоб товар полностью находился в индексе. Тогда при фильтрации не будет никаких дополнительных запросов к БД.
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    class Product(MPTTModel,SeoModel):    
        color = models.CharField('Цвет',blank=True,null=True,max_length=200)
        size = models.CharField('Размер',blank=True,null=True,max_length=200)
        stock_amount = models.FloatField(_(u"Stock amount"), default=0)
        sub_type = models.PositiveSmallIntegerField(_(u"Subtype"), choices=PRODUCT_TYPE_CHOICES, default=PRODUCT_WITH_VARIANTS)
        parent = models.ForeignKey("self", blank=True, null=True, verbose_name=u'Родитель', related_name="variants")
        # для связывания товара с категориями и свойствами
        categories = models.ManyToManyField("Category", blank=True)


    Соответственно, у первого виртуального - parent пустой. Далее, мы указываем parent у потомка (виртуальный (общий)-виртуальные товары по цветам - реальные товары с размерами)
  • Как правильно спроектировать товары с вариантами?

    @mr_drinkens89 Автор вопроса
    sim3x: структура типична. модель Product, с обычными свойствами для товара.
    В индексе у меня конечные товары (реальные, с размерами товара), а выводить я должен виртуальный товар. Поэтому, после того, как я отфильтровал, необходимо "выдрать" родителей для товара и вывести их в шаблон.
    Через Debug ToolBar увидел, что для 50 товаров идет порядка 1800 запросов (ищет родителя для товара)
    спасибо.
  • Как реализовать фильтры товаров django?

    @mr_drinkens89 Автор вопроса
    Решил-таки попробовать Haystack)
    Вопрос такой, а как "разбить" поиск по категориям?
    Можно ли обойтись без q?
    Сейчас работает: /catalog/odezhda/?q=92
    Необходимо: /catalog/odezhda
    q - это id категории, их я вставил в индекс. Но, хотелось бы обойтись в категориях без q в урле.
    Это возможно?
    Спасибо
  • Как взять данные по slug в elasticSearch?

    @mr_drinkens89 Автор вопроса
    sim3x: да.
    здесь описывается подобная ситуация, но, толком непонятно, как он этого добился)
    Либо не париться, и пусть эты q стоят в категориях)
  • Как взять данные по slug в elasticSearch?

    @mr_drinkens89 Автор вопроса
    sim3x: есть ли какие-то мысли по данному вопросу?)