У меня есть немного кода, который выглядит примерно так:
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')
, то пагинатор будет вести себя как положено.