Django нумерация страниц не соответствует входному запросу - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть немного кода, который выглядит примерно так:

page_objects = Page.objects.exclude(lorem).filter(blah).annotate(key=bar).order_by(foo)
paginator = Paginator(page_objects, 50)

В моем пользовательском интерфейсе я заметил, что при определенных значениях bar мне не хватает строк в выводе. Я провел эксперимент, чтобы сравнить вывод paginator с выводом запроса.

page_results = []
for page_number in paginator.page_range:
    result = paginator.page(page_number)
    page_results += result.object_list
paginator_ids = sorted([x.id for x in page_results])
page_object_ids = sorted(x.id for x in list(page_objects))
print(paginator_ids == page_object_ids) => FALSE
print(len(paginator_ids) == len(page_object_ids)) => TRUE

Как видите, список объектов в запросе и список всех объектов в paginator не совпадали. Я визуально проверил списки, чтобы убедиться, что это правильно (идентификаторы в двух списках явно различаются).

Я нахожусь на Django==1.11.3

Что происходит и почему мой пагинаторне ведет себя как документы?

Интересно, что если я изменю order_by на order_by(foo, 'id'), то пагинатор будет вести себя как положено.

1 Ответ

0 голосов
/ 07 ноября 2019

paginator просто разрезает вывод запроса. Это в сочетании с отложенными запросами возвращает данные в порядке, который не является необходимым, как и весь запрос. Короче говоря, нет ничего плохого в разбиении на страницы или наборе запросов, вы просто сравниваете два списка, которые упорядочены по-разному (как вы заметили, добавив идентификатор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...