Features: 1) Simplify descendant product filtering in filter_whole_categories by replacing intermediate query with direct filters.

Fixes: None;

Extra: 1) Remove redundant query and clean up conditional return formatting in `filter_whole_categories`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-06-17 11:58:05 +03:00
parent 5eccfd8e9e
commit c8dbaeeb80

View file

@ -335,26 +335,21 @@ class CategoryFilter(FilterSet):
fields = ["uuid", "name", "parent_uuid", "slug", "tags", "level", "order_by", "whole"] fields = ["uuid", "name", "parent_uuid", "slug", "tags", "level", "order_by", "whole"]
def filter_whole_categories(self, queryset, _name, value): 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( has_own_products = Exists(
Product.objects.filter(category=OuterRef('pk')) Product.objects.filter(category=OuterRef('pk'))
) )
has_desc_products = Exists( has_desc_products = Exists(
Product.objects.filter(category_id__in=descendant_cats) Product.objects.filter(
category__tree_id=OuterRef('tree_id'),
category__lft__gt=OuterRef('lft'),
category__rght__lt=OuterRef('rght'),
)
) )
annotated = queryset.annotate( annotated = queryset.annotate(
has_products=has_own_products | has_desc_products has_products=has_own_products | has_desc_products
) )
if value: if value:
return annotated.filter(has_products=True).distinct() return annotated.filter(has_products=True).distinct()
else:
return annotated.filter(has_products=False).distinct() return annotated.filter(has_products=False).distinct()
def filter_parent_uuid(self, queryset, _name, value): def filter_parent_uuid(self, queryset, _name, value):