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)
categories = models.ManyToManyField("Category"
Зачем?parent = models.ForeignKey("self"
Товар:
категория (которая на самом деле является тегом)
название коллекции
марка
...
ВариантТовара:
артикул
товар = ForeignKey(Товар)
цвет
размер
цена
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
.....
для магазина одежды структура уже меняется: необходимо "объединять" товары по их цветам.можно сделать модель цветов и выбирать цвет товара оттуда
Я представляю себе это так: "коробка". В ней товары, допустим 9 джинс трех цветов: желтый, синий, красный.
То есть первая абстракция: "коробка", на которой обычно пишут всю инфу о товарах (сколько цветов, сколько размеров)
Вторая: цвета. В нашем случае их три: желтый, синий, красный.
Ну и третья - уже по размерам для цвета
ТипТовара
название = (джинса, футболка, ...)
Коллекция
марка
Товар
коллекция = FK(Коллекция)
тип_товара = FK(ТипТовара)
ВариантТовара
артикул
товар = FK(Товар)
...
ТипТовара
название = (джинса, футболка, ...)
Коллекция
марка
Товар
коллекция = FK(Коллекция)
тип_товара = FK(ТипТовара)
ФотоТовара
фото = imageField
ВариантТовара
артикул
товар = FK(Товар)
фотки = m2m (фотоТовара)
ФотоТовара
путь
товар = FK(ВариантТовара)
Верно?не уверен, где тут нужен еластик. Все вытаскивается по ид
ВариантТовар1:
цвета: красный
размер: 41
фото1,Фото2,Фото3
ВариантТовар2:
цвета: красный
размер: 42
фото1,Фото2,Фото3
ВариантТовар3:
цвета: красный
размер: 43
фото1,Фото2,Фото3
class ProductImage(TimeStampedPositionModel):
product = models. ManyToManyField(ProductVariant)
image = ImageField("изображение", upload_to="uploads/products")
ФотоТовара
путь
товар = ForeignKey(ВариантТовара)
На каждый размер-цвет - свой набор фоток
ФотоТовара
путь
товар = ForeignKey(Товар)
цвет
def get_images():
images = self.product.images.filter(barcode=self.barcode)
return images
ТоварВариант
- размер
- цвет
- m2m (Фото)
верно?да
получается, мы будем иметь некий набор постоянных фоток, но, уже присваивать мы их сможем любому количеству товаров?да
Выходит, все равно, для одного цвета - один и тот же набор фотографий.и даже для разных товаров
с такой схемой "механизм привязки фоток" более открыт.и больше подвержен риску ошибки при наполнении
Color:
name = название цвета (желтый, синий, красный)
image = превьюшка для цвета
product = FK(Product) - виртуальный товар, то есть общий
variants = M2m(ProductVariant) - у одного цвета может быть несколько вариантов
prefetch_related("colors").all()
ТипТовара
название = (джинса, футболка, ...)
Коллекция
марка
Товар
коллекция = FK(Коллекция)
тип_товара = FK(ТипТовара)
ФотоТовара
фото = imageField
ВариантТовара
артикул
товар = FK(Товар)
фотки = m2m (фотоТовара)
цвет = м2м(Цвет)
Цвет:
ргб = CharField() # "#000000"
название
Но, этот виртуальный товар должен "знать", сколько у него цветов товара, и сколько размеров в каждом цвете.для етого достаточно запросить у ВариантаТовара какие он имеет цвета и размеры
Я думал, что ВариантТовар содержит в себе только один размер.ну да
Таки полностью достаточно, грубя говоря, двух основных моделей Товар и ТоварВариант? И сопутствующих с ними Фото, Категория...?+ цвет
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 %}
КатегорияТовара (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 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 %}
Уточнение - цвета и азмеры нужно свзяать между собой.
Пример: выбрали цвет = показало доступные размеры
Да/нет?
Зачем цвет делать куском фотки, если он по моей задумке должен быть общий для многих ВариантовТоваров?
Название: джинсы гуччи
Размер: 43
Цвет: Красный
Артикул: 55555
Название: Джинсы Гуччи
Размер: 45
Цвет: Красный
Артикул: 55555
Название: Джинсы гуччи
Размер: 43
Цвет: Зеленый
Артикул: 55555
variants = variants.filter(size__in=sizes)
vProducts = []
for product in variants:
vProducts.append(product.product)
class Category(MPTTModel, SeoModel):
name = models.CharField("Название категории", max_length=250)
slug = AutoSlugField("Slug", unique=True, populate_from='name', always_update=False, max_length=255, editable=True)
parent = models.ForeignKey("self", verbose_name="Родительская категория", blank=True, null=True
description = MarkdownxField("Описание", blank=True)
display = models.BooleanField("Показывать", default=True)
class Product(SeoModel):
sku = models.CharField('Артикул', max_length=250, help_text='Объединияет между собой все варианты воедино')
color = models.ForeignKey(Color, verbose_name='Оригинальный цвет (из файла резерва)', blank=True, null=True, on_delete=models.SET_NULL)
name = models.CharField('Название', blank=True, max_length=350)
slug = AutoSlugField("Уникальная ссылка", slugify=custom_slugify, unique=True, populate_from='name', editable=True)
category = models.ManyToManyField(Category,verbose_name='Категория',blank=True,null=True,related_name='my_category')
brend = models.ForeignKey(Brend, verbose_name='Бренд',blank=True,null=True, on_delete=models.SET_NULL)