Optimized catalog view: filter only active products/kits in prefetch

This commit is contained in:
2025-12-01 11:20:39 +03:00
parent f7b62b45f3
commit 11c76ece53

View File

@@ -3,6 +3,7 @@
""" """
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.db.models import Prefetch
from ..models import Product, ProductKit, ProductCategory from ..models import Product, ProductKit, ProductCategory
@@ -26,10 +27,20 @@ class CatalogView(LoginRequiredMixin, TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
# Все активные категории # Оптимизированный prefetch только для активных товаров и комплектов
active_products_prefetch = Prefetch(
'products',
queryset=Product.objects.filter(status='active').order_by('name')
)
active_kits_prefetch = Prefetch(
'kits',
queryset=ProductKit.objects.filter(status='active', is_temporary=False).order_by('name')
)
# Все активные категории с prefetch только активных товаров
categories = list(ProductCategory.objects.filter( categories = list(ProductCategory.objects.filter(
is_active=True, is_deleted=False is_active=True, is_deleted=False
).prefetch_related('products', 'kits').order_by('name')) ).prefetch_related(active_products_prefetch, active_kits_prefetch).order_by('name'))
# Строим дерево # Строим дерево
category_tree = self.build_category_tree(categories, parent=None) category_tree = self.build_category_tree(categories, parent=None)