Оптимизация?

This commit is contained in:
zein
2025-11-03 07:57:31 +03:00
parent fa14cb808e
commit 1dff9fbffb
2 changed files with 30 additions and 14 deletions

View File

@@ -1,4 +1,3 @@
# db.py
import os import os
from pymongo import MongoClient from pymongo import MongoClient

View File

@@ -1,36 +1,53 @@
from django.shortcuts import render from django.shortcuts import render
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.core.cache import cache
from .models import manga_collection from .models import manga_collection
def manga_catalog(request): def manga_catalog(request):
# Получаем список всех уникальных тегов # Кешируем общее количество (раз в 5 минут)
total_manga_count = cache.get('total_manga_count')
if total_manga_count is None:
total_manga_count = manga_collection.estimated_document_count()
cache.set('total_manga_count', total_manga_count, 300)
# Все теги — можно тоже кешировать, но пока оставим
all_tags = manga_collection.distinct("tags") all_tags = manga_collection.distinct("tags")
# Получаем выбранные теги из GET-параметров # Получаем выбранные теги
selected_tags = request.GET.getlist('tags') selected_tags = request.GET.getlist('tags')
# Формируем запрос для фильтрации
query = {} query = {}
if selected_tags: if selected_tags:
query['tags'] = {'$all': selected_tags} query['tags'] = {'$all': selected_tags}
# Получаем отфильтрованные записи # Считаем количество для пагинации (можно тоже кешировать по хешу, но пока так)
filtered_manga = list(manga_collection.find(query)) total_filtered = manga_collection.count_documents(query)
# Пагинация # Получаем номер страницы
paginator = Paginator(filtered_manga, 20) page_number = request.GET.get('page') or 1
page_number = request.GET.get('page') try:
page_number = int(page_number)
except (TypeError, ValueError):
page_number = 1
per_page = 20
skip = (page_number - 1) * per_page
# Получаем только текущую страницу
manga_cursor = manga_collection.find(query).skip(skip).limit(per_page)
manga_list = list(manga_cursor)
# Создаём Paginator и page_obj ПРАВИЛЬНО
paginator = Paginator(range(total_filtered), per_page)
page_obj = paginator.get_page(page_number) page_obj = paginator.get_page(page_number)
total_manga_count = manga_collection.count_documents({}) # Передаём данные в шаблон
return render(request, 'manga_catalog.html', { return render(request, 'manga_catalog.html', {
'page_obj': page_obj, 'page_obj': page_obj,
'manga_list': page_obj.object_list, 'manga_list': manga_list,
'total_manga_count': total_manga_count, 'total_manga_count': total_manga_count,
'all_tags': sorted(all_tags), 'all_tags': sorted(all_tags),
'selected_tags': selected_tags 'selected_tags': selected_tags,
}) })
def show_manga(request, manga_id): def show_manga(request, manga_id):