Обрабатывать только подмножество набора запросов в Django (и возвращать исходный набор запросов)

У меня есть общий вид списка в Django, который возвращает около 300 объектов (если не выполняется поиск).

У меня настроена нумерация страниц для отображения только 10 объектов.

Итак, я запрашиваю базу данных, затем перебираю объекты, обрабатывая их и добавляя дополнительные значения перед отображением. Я заметил, что все 300 объектов обрабатываются, а разбиение на страницы выполняется после обработки. Поэтому я хочу выполнять обработку только тех объектов, которые будут отображаться, чтобы повысить производительность.

Я рассчитываю индексы объектов в наборе запросов, которые должны быть обработаны: 0-10 для страницы 1, 11-20 для страницы 2, 21-30 для страницы 3 и т. д.

Теперь я хочу обрабатывать только объекты в отображаемом диапазоне, но возвращать полный набор запросов (чтобы жанровое представление работало так, как ожидалось).

Сначала я пробовал:

for object in queryset[slice_start:slice_end] :
     # process things here

return queryset

Но срез, кажется, возвращает новый набор запросов, а исходные объекты набора запросов не имеют никаких вычисленных значений.

В настоящее время мое решение:

index = -1
for object in queryset:
     index += 1   
     if index < slice_start or index > slice_end : continue
     # process things here
return queryset 

Теперь это работает, но кажется довольно хакерским и неэлегантным для Python. Есть ли более питонический способ сделать это?


person wobbily_col    schedule 13.06.2012    source источник
comment
Вы используете класс Django Paginator?   -  person Simeon Visser    schedule 13.06.2012


Ответы (2)


Если вы используете класс Paginator Django (документы), вы можете запросить текущую страницу и перебрать эти объекты в представлении:

from django.core.paginator import Paginator

# in the view:
p = Paginator(objects, 2)
page = p.page(current_page)
for o in page.object_list:
    # do processing
    pass

Вы можете получить значение для current_page из параметров запроса (например, параметр page в request.GET).

person Simeon Visser    schedule 13.06.2012
comment
Как вы получаете объект paginator из общего представления? У меня включена разбивка на страницы, поэтому я считаю ненужным создавать еще одну. - person wobbily_col; 04.12.2012

Вы должны выполнить обработку результатов page.object_list, которые гарантированно будут содержать только объекты для этой страницы.

person Daniel Roseman    schedule 13.06.2012