Исправлено отображение товаров в каталоге - добавлены товары без категорий

Проблема: после оптимизации товары показывались только из категорий,
товары без категорий не отображались.

Решение: теперь загружаются все активные товары и комплекты напрямую,
дополняя список товарами, которые не были загружены через категории.

Логика загрузки:
1. Сначала из категорий (используя prefetch кеш) - оптимизация
2. Затем все активные товары напрямую - полнота данных
3. Дедупликация через словари (products_dict, kits_dict)
This commit is contained in:
2025-12-27 21:01:30 +03:00
parent 978e97afaf
commit 2e607a3b38

View File

@@ -59,26 +59,50 @@ class CatalogView(LoginRequiredMixin, TemplateView):
# Строим дерево
category_tree = self.build_category_tree(categories, parent=None)
# Извлекаем товары и комплекты из уже загруженных категорий
# Это избегает дополнительных запросов к БД
# Извлекаем товары и комплекты - два способа:
# 1. Из категорий (для оптимизации prefetch)
# 2. Все активные товары напрямую (для товаров без категорий)
products_dict = {}
kits_dict = {}
# Сначала извлекаем из категорий (используем prefetch кеш)
for cat in categories:
# Извлекаем из prefetch_related кеша
for p in cat.products.all():
if p.id not in products_dict:
p.item_type = 'product'
# main_photo уже загружено через prefetch
p.main_photo = p.photos.all()[0] if p.photos.all() else None
# Вычисляем свободное количество
p.total_free = p.total_available - p.total_reserved
products_dict[p.id] = p
for k in cat.kits.all():
if k.id not in kits_dict:
k.item_type = 'kit'
# main_photo уже загружено через prefetch
k.main_photo = k.photos.all()[0] if k.photos.all() else None
kits_dict[k.id] = k
# Теперь добавляем все товары, которых еще нет (товары без категорий или не загруженные)
all_products = Product.objects.filter(status='active').prefetch_related(
Prefetch('photos', queryset=ProductPhoto.objects.order_by('order'))
).annotate(
total_available=total_available,
total_reserved=total_reserved,
).order_by('name')
for p in all_products:
if p.id not in products_dict:
p.item_type = 'product'
p.main_photo = p.photos.all()[0] if p.photos.all() else None
p.total_free = p.total_available - p.total_reserved
products_dict[p.id] = p
# Все комплекты
all_kits = ProductKit.objects.filter(status='active', is_temporary=False).prefetch_related(
Prefetch('photos', queryset=ProductKitPhoto.objects.order_by('order'))
).order_by('name')
for k in all_kits:
if k.id not in kits_dict:
k.item_type = 'kit'
k.main_photo = k.photos.all()[0] if k.photos.all() else None
kits_dict[k.id] = k