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

У меня есть модели Category и SubCategory в Django, и мне нужно получить потомка модели Category в 'class SubCategoriesListView'

`models.py
class Category(models.Model):
    name = models.CharField('Категория', max_length=150, default='name')
    url = models.SlugField(max_length=160, unique=True)


class SubCategory(models.Model):
    name = models.CharField('SubCategory', max_length=150, default=True)
    url = models.SlugField(max_length=160, unique=True)
    image = models.ImageField('Pic', upload_to='img', null=True, blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

Как отфильтровать подкатегории, связанные с моделью категории? (Я должен использовать detailview позже, поэтому решение должно быть с использованием модели ListView)

`views.py

class CategoriesListView(ListView):
    model = Category
    queryset = Category.objects.all()
    template_name = 'catalog/category_list.html'
    context_object_name = 'category_list'

class SubCategoriesListView(Category, ListView):
    model = SubCategory
    queryset = SubCategory.objects.all()
    template_name = 'catalog/subcategory_list.html'
    context_object_name = 'subcategory_list'`

Вы можете фильтровать по первичному ключу элемента:

#                   no Category 🖟
class SubCategoriesListView(ListView):
    model = SubCategory
    queryset = SubCategory.objects.all()
    template_name = 'catalog/subcategory_list.html'
    context_object_name = 'subcategory_list'

    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .filter(category_id=kwargs['category_id'])
        )

в urls.py мы регистрируем это как:

urlpatterns = [
    path(
        'category/<int:category_id>/',
        SubCategoriesListView.as_view(),
        name='subcategories',
    )
]

Затем вы можете посетить category/14, например, чтобы получить список всех SubCategory, принадлежащих Category с pk=14.

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