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