Как избавиться от дублей категорий в Django?

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

HTML:

<header class="header">
  <div class="filter-category">
    <button class="button button_type_all" data-filter="all">Все</button>
    {% for c in categories %} {# Все категории #}
      {% if c.get_prods__count > 0 %} {# Все категории в которых есть товары #}
         {% for sc in subcategories %} {# Все подкатегории #}
           {% if sc.get_prods__count > 0 %} {# Все подкатегории в которых есть товары #}
             {% if c.pk == sc.category_id %} {# Все категории рк которых совпадает с id категории в подкатегории#}
               <button class="button button_type_dog"
                                        data-filter="{{ c.slug }},{{ sc.slug }}">{{ c.cat_name }}</button> {# Кнопки для категорий по которым производится фильтрация. Если в категории несколько подкатегорий, то и кнопок с одинаковым названием будет несколько. Нужно только по одной кнопке для каждой категории #}
             {% endif %}
           {% endif %}
         {% endfor %}
       {% endif %}
     {% endfor %}
   </div>
   <div class="filter">
     {% for c in categories %} {# Все категории #}
       {% if c.get_prods__count > 0 %} {# Все категории в которых есть товары #}
         {% for sc in subcategories %} {# Все подкатегории #}
           {% if sc.get_prods__count > 0 %} {# Все подкатегории в которых есть товары #}
             {% if c.pk == sc.category_id %} {# Все категории рк которых совпадает с id категории в подкатегории#}
               <button class="button button_type_cat"
                                        data-filter="{{ sc.slug }}">{{ sc.sub_cat_name }}</button> {# Все кнопки подкатегорий по которым производится фильтрация#}
             {% endif %}
           {% endif %}
         {% endfor %}
       {% endif %}
     {% endfor %}
   </div>
</header>
<main class="content">
  <div class="container">
    {% for c in categories %} {# Все категории #}
      {% if c.get_prods__count > 0 %} {# Все категории в которых есть товары #}
        {% for sc in subcategories %} {# Все подкатегории #}
          {% if sc.get_prods__count > 0 %} {# Все подкатегории в которых есть товары #}
            {% if c.pk == sc.category_id %} {# Все категории рк которых совпадает с id категории в подкатегории#}
              {% for p in prods %} {# Все товары #}
                {% if p.subcategory_id == sc.pk %} {# Все товары id подкатегорий которых совпадают с рк подкатегорий #}
                  {% if p.photo %}
                    <div class="card {{ sc.slug }}">
                      <a href="{{ p.get_absolute_url }}"> {# карточки товаров #}
                      {{ p.title }}
                      </a>
                    </div>
                  {% endif %}
                {% endif %}
              {% endfor %}
            {% endif %}
          {% endif %}
        {% endfor %}
      {% endif %}
    {% endfor %}
  </div>
</main>

Models:

from django.db import models
from django.urls import reverse
from django_unique_slugify import unique_slugify
from pytils.translit import slugify
from smart_selects.db_fields import ChainedForeignKey


class Category(models.Model):
    cat_name = models.CharField(max_length=25, verbose_name='Название')
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
    time_create = models.DateTimeField(auto_now_add=True)
    time_update = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=True)

    @staticmethod
    def get_all_categories():
        return Category.objects.all()

    def __str__(self):
        return self.cat_name

    def get_absolute_url(self):
        return reverse('category', kwargs={'cat_slug': self.slug})

    def save(self, *args, **kwargs):
        slug_str = slugify(self.cat_name)
        unique_slugify(self, slug_str)
        if not self.slug:
            self.slug = slugify(self.cat_name)
        super(Category, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = 'Категории'
        verbose_name = 'Категория'
        ordering = ['cat_name']


class SubCategory(models.Model):
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Категория',
                                 related_name='get_subcats')
    sub_cat_name = models.CharField(max_length=25, unique=True, verbose_name='Название')
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
    time_create = models.DateTimeField(auto_now_add=True)
    time_update = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=True)

    @staticmethod
    def get_all_subcategories():
        return SubCategory.objects.all()

    def __str__(self):
        return self.sub_cat_name

    def get_absolute_url(self):
        return reverse('subcategory', kwargs={'cat_slug': self.category.slug, 'scat_slug': self.slug})

    def save(self, *args, **kwargs):
        slug_str = slugify(self.sub_cat_name)
        unique_slugify(self, slug_str)
        if not self.slug:
            self.slug = slugify(self.sub_cat_name)
        super(SubCategory, self).save(*args, **kwargs)

    class Meta:
        verbose_name_plural = 'ПодКатегории'
        verbose_name = 'ПодКатегория'
        ordering = ['sub_cat_name']


class Product(models.Model):
    price = models.DecimalField(max_digits=15, decimal_places=2, null=True, verbose_name='Цена')
    category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, verbose_name='Категория',
                                 related_name='get_prods')
    subcategory = ChainedForeignKey(
        'SubCategory',
        on_delete=models.SET_NULL,
        null=True,
        verbose_name='ПодКатегория',
        related_name='get_prods',
        chained_field='category',
        chained_model_field='category',
        show_all=False,
        auto_choose=True,
        sort=True
    )
    title = models.CharField(max_length=255, verbose_name='Название')
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
    content = models.TextField(blank=True, verbose_name='Текст')
    photo = models.ImageField(upload_to='images/%Y/%m/%d/', verbose_name='Фото')
    time_create = models.DateTimeField(auto_now_add=True, verbose_name='Создано')
    time_update = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
    is_published = models.BooleanField(default=True, verbose_name='Опубликовано')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('product', kwargs={'cat_slug': self.category.slug, 'scat_slug': self.subcategory.slug,
                                          'prod_slug': self.slug})

    def save(self, *args, **kwargs):
        slug_str = slugify(self.title)
        unique_slugify(self, slug_str)
        if not self.slug:
            self.slug = slugify(self.title)
        super(Product, self).save(*args, **kwargs)

    class Meta:
        verbose_name = 'Товары'
        verbose_name_plural = 'Товары'
        ordering = ['-id']

Помогите, пожалуйста, составить правильную фильтрацию.


Ответы (0 шт):