Django Бесконечная динамика Многоуровневая вложенная категория

У меня есть три модели, предположим, одна из них - категория, другая - подкатегория и третья - продукт. Перед регистрацией товара пользователь должен добавить подкатегорию, а перед добавлением подкатегории мы должны добавить категорию в таблицу подкатегорий. Таким образом, теперь добавление товара должно выглядеть как Мужская мода (категория)-> Рубашка (подкатегория)-> Белая рубашка (продукт). Все работает нормально, и у меня нет никаких проблем. Но есть внезапные изменения, например, если мне нужно добавить бесконечную подкатегорию, предположим, что некоторые продукты могут пройти через две подкатегории Мужская мода (Категория) -> Обувь (Подкатегория) -> Обувь (Подкатегория) -> Премиум обувь (Продукт)

или может быть может быть, некоторые продукты, как пройти через две подкатегории Мужская мода (Категория) -> Обувь (Подкатегория) -> Обувь (Подкатегория) -> Кожаная обувь (Подкатегория) -> Премиум обувь (Продукт)

Это будет зависеть от пользователя, он может добавить столько подкатегорий, сколько захочет. Это должно быть как динамическое, но мне интересно как. Если я возьму несколько данных и добавлю модель динамически (я не знаю, могу ли я сделать это с django, потому что как я могу синхронизировать базу данных без использования команды migrate), это довольно сильно запутало меня, и я застрял здесь. Любая помощь будет очень признательна.

class Category(models.Model):
   name = models.CharField(max_length=100)

class Subcategory(models.Model):
   name = models.CharField(max_length=100)
   category = models.ForeignKey(Category)

class Product(models.Model):
   name = models.CharField(max_length=100)
   subcategory = models.ForeignKey(Subcategory)

Вы можете сделать ссылку на категорию необязательной и добавить необязательный самореферентный внешний ключ в модели подкатегории:

class Subcategory(models.Model):
   name = models.CharField(max_length=100)
   category = models.ForeignKey(Category, blank=True, null=True)
   subcategory models.ForeignKey(Subcategory, blank=True, null=True)

теперь подкатегория может быть направлена на категорию ИЛИ на другую подкатегорию, что обеспечивает бесконечную вложенность подкатегорий.

Альтернативно, вы можете добавить некоторое свойство "уровень" в модель подкатегории:

class Subcategory(models.Model):
   name = models.CharField(max_length=100)
   category = models.ForeignKey(Category)
   level = models.IntegerField(default=0)

тогда вы можете иметь сколько угодно подкатегорий, указывающих на данную категорию, и упорядочить их с помощью поля level.

<<<Каждый подход имеет свои плюсы и минусы. Свойство уровня менее запутанно и работает лучше, но самоссылкой легче управлять.

Вернуться на верх