Оптимизация?
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
# db.py
|
||||
import os
|
||||
from pymongo import MongoClient
|
||||
|
||||
|
||||
@@ -1,36 +1,53 @@
|
||||
from django.shortcuts import render
|
||||
from django.core.paginator import Paginator
|
||||
from django.core.cache import cache
|
||||
from .models import manga_collection
|
||||
|
||||
|
||||
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")
|
||||
|
||||
# Получаем выбранные теги из GET-параметров
|
||||
# Получаем выбранные теги
|
||||
selected_tags = request.GET.getlist('tags')
|
||||
|
||||
# Формируем запрос для фильтрации
|
||||
query = {}
|
||||
if 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')
|
||||
# Получаем номер страницы
|
||||
page_number = request.GET.get('page') or 1
|
||||
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)
|
||||
|
||||
total_manga_count = manga_collection.count_documents({})
|
||||
|
||||
# Передаём данные в шаблон
|
||||
return render(request, 'manga_catalog.html', {
|
||||
'page_obj': page_obj,
|
||||
'manga_list': page_obj.object_list,
|
||||
'manga_list': manga_list,
|
||||
'total_manga_count': total_manga_count,
|
||||
'all_tags': sorted(all_tags),
|
||||
'selected_tags': selected_tags
|
||||
'selected_tags': selected_tags,
|
||||
})
|
||||
|
||||
def show_manga(request, manga_id):
|
||||
|
||||
Reference in New Issue
Block a user