Оптимизация?
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
# db.py
|
|
||||||
import os
|
import os
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user