Как сделать категории и подкатегории в Django

Рейтинг: 0Ответов: 3Опубликовано: 12.04.2023

У меня есть модель товаров, категории и подкатегории. Подкатегория обязательно принимает категорию. А товар принимает категорию и подкатегорию, вот код:

class Product(models.Model):
    photo = models.ImageField(verbose_name='Фотография', upload_to='products/')
    name = models.CharField(verbose_name='Название', max_length=100)
    description = models.TextField(verbose_name='Описание', blank=False)
    price = models.PositiveIntegerField(verbose_name='Цена')
    created_at = models.DateTimeField(verbose_name='Время создания', auto_now_add=True)
    updated_at = models.DateTimeField(verbose_name='Время редактирования', auto_now=True)
    is_published = models.BooleanField(verbose_name='Опубликован', default=True)
    product_category = models.ForeignKey(verbose_name='Категория', to='Category', on_delete=models.PROTECT)
    product_subcategory = models.ForeignKey(verbose_name='Подкатегория', to='SubCategory', on_delete=models.PROTECT,
                                            null=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Продукт'
        verbose_name_plural = 'Продукты'
        db_table = 'products'
        ordering = ['-created_at']


class Category(models.Model):
    name = models.CharField(verbose_name='Название', max_length=100)
    description = models.TextField(verbose_name='Описание', blank=True)
    created_at = models.DateTimeField(verbose_name='Время создания', auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'
        db_table = 'categories'
        ordering = ['-created_at']


class SubCategory(models.Model):
    name = models.CharField(verbose_name='Название подкатегории', max_length=100)
    description = models.TextField(verbose_name='Описание подкатегории', blank=True)
    created_at = models.DateTimeField(verbose_name='Время создания подкатегории', auto_now_add=True)
    subcategory_category = models.ForeignKey(verbose_name='Категория', to='Category', on_delete=models.PROTECT,
                                             null=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Подкатегория'
        verbose_name_plural = 'Подкатегории'
        db_table = 'subcategories'
        ordering = ['-created_at']

Теперь в Django админке, у меня мой товар принимает категорию и подкатегорию. Но загвоздка в том что категория 'test' не имеет подкатегорию 'subcat'. В категории 'test' есть такие подкатегории как 'test1' 'test2'. Как мне в Django админке при создании товара, когда он будет выбирать подкатегорию показывать только подкатегории которые есть в категории которую он выбрал. Я пытался решить создав новую модель но у меня не получается! Прошу помочь)

Скрин Django админки

Ответы

▲ 0

Я бы на вашем месте использовал готовый пакет django-mptt и django-mptt-admin — это полностью решит все ваши задачи и проблемы, и не будет лишних ненужных таблиц в БД.

Документация очень подробная и понятная, думаю дополнительно не нужно писать примеры.

▲ 0

Я бы попробовал что то подобное:

class Category(models.Model):
    name = models.CharField(verbose_name='Название', max_length=100)
    created_at = models.DateTimeField(verbose_name='Время создания', 
                                      auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'
        db_table = 'categories'
        ordering = ['-created_at']

    def get_subcategory(self):
        subcategory_objects = SubCategory.objects.filter(subcategory_category=self)
        return subcategory_objects

Затем бы обратился к данному методу в админ панели.

▲ 0

Моя проблема исправляется простым использованием django-smart-selects. Документация