diff --git a/core/filters.py b/core/filters.py index 78979799..4188d2b2 100644 --- a/core/filters.py +++ b/core/filters.py @@ -335,9 +335,27 @@ class CategoryFilter(FilterSet): fields = ["uuid", "name", "parent_uuid", "slug", "tags", "level", "order_by", "whole"] def filter_whole_categories(self, queryset, _name, value): + descendant_cats = Category.objects.filter( + tree_id=OuterRef('tree_id'), + lft__gt=OuterRef('lft'), + rght__lt=OuterRef('rght'), + ).values('pk') + + has_own_products = Exists( + Product.objects.filter(category=OuterRef('pk')) + ) + has_desc_products = Exists( + Product.objects.filter(category_id__in=descendant_cats) + ) + + annotated = queryset.annotate( + has_products=has_own_products | has_desc_products + ) + if value: - return queryset.filter(products__isnull=False).distinct() - return queryset.filter(products__isnull=True).distinct() + return annotated.filter(has_products=True).distinct() + else: + return annotated.filter(has_products=False).distinct() def filter_parent_uuid(self, queryset, _name, value): if value in ("", "null", "None"):