@ildar_vrn
Познаю python и django

Как лучше реализовать модели для разных товаров?

Всем привет. Делаю практикуюсь в создании интернет магазина. Появился вопрос в архитектуре БД, разные категории с разными характеристиками. Видел что для этих целей можно использовать схему 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


635ef74e01df2039007071.jpeg
635ef76069508106847723.jpeg
635ef76942120420893242.jpeg
635ef770643a4432163318.jpeg

Но получается, так что приходится сначало создать товар. Потом зайти в таблицу product_attr_value выбрать один или несколько товаров, выбрать одну характеристику и добавить к ней значение. Соотвественно для каждой характеристики создавать по отдельности значения.

Я тут явно что-то не так делаю, либо нужно в админке для products при создании выводить поля из таблицы product_attrs и product_attr_value чтобы разом заполнять. Либо писать код на python чтобы из excel или текстовых файлов парсить данные и заносить их напрямую в БД. Второй вариант есть в планах. Но то что в админке всё по отдельности меня напраягает.

P.S: django-eav гуглил, понял, что он удобен когда на ходу нужно добавить полей в таблицу, без миграций. Но у меня характеристики для коктреных категорий не меняются. По поводу JSONField не понимаю как потом выполнять поиск для фильтров. Заранее спасибо.
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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