Как создать категории и подкатегории в моделях django?
Я создаю простой сайт для автомобильного рынка. Я написал марку, серию и модель автомобиля. (Я намеренно хочу рассматривать каждую из них как отдельную модель.) Когда я создаю автомобиль в панели администратора, я хочу иметь возможность выбрать марку автомобиля - скажем, Mercedes - и когда я выбираю марку, я хочу, чтобы следующим вариантом была только серия Mercedes, а не серия других автомобилей.
Вот представление моего кода на данный момент:
class Brand(models.Model):
brand = models.CharField(max_length=100)
class Series(models.Model):
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
series = models.CharField(max_length=100)
class Car(models.Model):
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
series = models.ForeignKey(Series, on_delete=models.CASCADE)
Use a ChainedForeignKey
[readthedocs.io] instead from the django-smart-selects
package [readthedocs.io]:
from smart_selects.db_fields import ChainedForeignKey
class Car(models.Model):
brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
series = ChainedForeignKey(
Series,
chained_field='brand',
chained_model_field='brand',
show_all=False,
on_delete=models.CASCADE,
)
Похоже, что у вас есть краткое представление об иерархии моделей, но вам нужно только реализовать ее. Это то, что Django делает из коробки, вам не нужен сторонний пакет для поддержки этого.
Начните с чтения о моделях в Django, особенно о первичных и вторичных/иностранных ключах.
Вы будете связывать каждую последующую модель через внешний ключ с первичной моделью, используя отображение "многие-ко-многим". Установите основной первичный ключ в качестве автомобиля (на нижнем уровне). Учитывая, что это торговая площадка, задайте в качестве уникального идентификатора что-то вроде UUID или BigInt, поскольку у вас, скорее всего, будет много значений.
Я бы пропустил подход с таблицами перекрестков и просто создал связь в ваших моделях, примерно так:
class cars(models.Model):
name = models.CharField(max_length=100)
series = models.ManyToManyField("series", related_name="cars", blank=True)
brand = models.ManyToManyField("brand", related_name="cars", blank=True)
class series(models.Model):
your model here
class brand(models.Model):
your model here
Затем вы можете создать это в админке Django и создать там отношения. В конце концов, вы можете показать это конечному пользователю в пользовательском css/html и разрешить выбор.