Как создать категории и подкатегории в моделях 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 и разрешить выбор.

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