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:
parent
5eccfd8e9e
commit
c8dbaeeb80
1 changed files with 6 additions and 11 deletions
|
|
@ -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):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue