Исправлено отображение товаров в каталоге - добавлены товары без категорий
Проблема: после оптимизации товары показывались только из категорий, товары без категорий не отображались. Решение: теперь загружаются все активные товары и комплекты напрямую, дополняя список товарами, которые не были загружены через категории. Логика загрузки: 1. Сначала из категорий (используя prefetch кеш) - оптимизация 2. Затем все активные товары напрямую - полнота данных 3. Дедупликация через словари (products_dict, kits_dict)
This commit is contained in:
@@ -59,28 +59,52 @@ class CatalogView(LoginRequiredMixin, TemplateView):
|
|||||||
# Строим дерево
|
# Строим дерево
|
||||||
category_tree = self.build_category_tree(categories, parent=None)
|
category_tree = self.build_category_tree(categories, parent=None)
|
||||||
|
|
||||||
# Извлекаем товары и комплекты из уже загруженных категорий
|
# Извлекаем товары и комплекты - два способа:
|
||||||
# Это избегает дополнительных запросов к БД
|
# 1. Из категорий (для оптимизации prefetch)
|
||||||
|
# 2. Все активные товары напрямую (для товаров без категорий)
|
||||||
products_dict = {}
|
products_dict = {}
|
||||||
kits_dict = {}
|
kits_dict = {}
|
||||||
|
|
||||||
|
# Сначала извлекаем из категорий (используем prefetch кеш)
|
||||||
for cat in categories:
|
for cat in categories:
|
||||||
# Извлекаем из prefetch_related кеша
|
|
||||||
for p in cat.products.all():
|
for p in cat.products.all():
|
||||||
if p.id not in products_dict:
|
if p.id not in products_dict:
|
||||||
p.item_type = 'product'
|
p.item_type = 'product'
|
||||||
# main_photo уже загружено через prefetch
|
|
||||||
p.main_photo = p.photos.all()[0] if p.photos.all() else None
|
p.main_photo = p.photos.all()[0] if p.photos.all() else None
|
||||||
# Вычисляем свободное количество
|
|
||||||
p.total_free = p.total_available - p.total_reserved
|
p.total_free = p.total_available - p.total_reserved
|
||||||
products_dict[p.id] = p
|
products_dict[p.id] = p
|
||||||
|
|
||||||
for k in cat.kits.all():
|
for k in cat.kits.all():
|
||||||
if k.id not in kits_dict:
|
if k.id not in kits_dict:
|
||||||
k.item_type = 'kit'
|
k.item_type = 'kit'
|
||||||
# main_photo уже загружено через prefetch
|
|
||||||
k.main_photo = k.photos.all()[0] if k.photos.all() else None
|
k.main_photo = k.photos.all()[0] if k.photos.all() else None
|
||||||
kits_dict[k.id] = k
|
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
|
||||||
|
|
||||||
# Объединяем и сортируем
|
# Объединяем и сортируем
|
||||||
items = sorted(list(products_dict.values()) + list(kits_dict.values()), key=lambda x: x.name)
|
items = sorted(list(products_dict.values()) + list(kits_dict.values()), key=lambda x: x.name)
|
||||||
|
|||||||
Reference in New Issue
Block a user