Всем привет. Делаю практикуюсь в создании интернет магазина. Появился вопрос в архитектуре БД, разные категории с разными характеристиками. Видел что для этих целей можно использовать схему EAV или JsonField. Остановился пока на первой. Создал вот такую иерархию:
class Category(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, unique=True, blank=True)
icon = models.ImageField(null=True,blank=True, upload_to='images/')
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, unique=True, blank=True)
article = models.IntegerField(blank=False)
price = models.FloatField()
description = models.TextField(null=True, blank=True)
sales_price = models.FloatField(null=True,blank=True)
sold_time = models.IntegerField(null=True, blank=True)
category_id = models.ForeignKey(Category, on_delete=models.PROTECT)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super(Product, self).save(*args, **kwargs)
def __str__(self):
return self.name
class product_attrs(models.Model):
category_id = models.ForeignKey(Category, on_delete=models.PROTECT)
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class product_attr_value(models.Model):
product_id = models.ManyToManyField(Product)
attrs_id = models.ForeignKey(product_attrs, on_delete=models.PROTECT)
value = models.CharField(max_length=255)
opt_value = models.CharField(max_length=255, blank=True, null=True)
def __str__(self):
return self.value
Но получается, так что приходится сначало создать товар. Потом зайти в таблицу product_attr_value выбрать один или несколько товаров, выбрать одну характеристику и добавить к ней значение. Соотвественно для каждой характеристики создавать по отдельности значения.
Я тут явно что-то не так делаю, либо нужно в админке для products при создании выводить поля из таблицы product_attrs и product_attr_value чтобы разом заполнять. Либо писать код на python чтобы из excel или текстовых файлов парсить данные и заносить их напрямую в БД. Второй вариант есть в планах. Но то что в админке всё по отдельности меня напраягает.
P.S: django-eav гуглил, понял, что он удобен когда на ходу нужно добавить полей в таблицу, без миграций. Но у меня характеристики для коктреных категорий не меняются. По поводу JSONField не понимаю как потом выполнять поиск для фильтров. Заранее спасибо.