Страница Django paginator превращается в список
Я пытаюсь создать супружеский сайт на Django. Ниже приведен код для одновременного отображения одного профиля.
unfiltered_list = profile_matches
for profile in unfiltered_list:
print("\n profile:",profile,"\n")
profiles_list = profile_matches
paginator = Paginator(profiles_list,1)
page_number = request.GET.get('page', 1)
profiles = paginator.page(page_number)
profile_id = profiles.object_list.values('user_model_for_profile_id')
Код работает нормально, если я удаляю цикл for, но когда я пытаюсь выполнить цикл по нефильтрованному списку, "профили" становятся списком, хотя я к нему не прикасался, кроме создания переменной, которая ссылается на него. Я получаю сообщение Attributeerror, в котором говорится AttributeError: Объект "список" не имеет атрибута "значения"
Это проблема с самим Django? Или я что-то упускаю?
Это действительно так, причина, по которой это происходит, заключается в том, что Paginator
в Django разбивает набор запросов [GitHub], действительно:
def page(self, number): """Return a Page object for the given 1-based page number.""" # … return self._get_page(self.object_list[bottom:top], number, self)
и это вернет значение QuerySet
если исходное значение QuerySet
не имеет result_cache
.
Но если QuerySet
результаты загружены в память, то возвращает кэш результатов с нарезкой <<[GitHub], действительно:
def __getitem__(self, k): """Retrieve an item or slice from the set of results.""" # … if self._result_cache is not None: return self._result_cache[k] # …
поскольку ._result_cache
представляет собой список результатов, результатом действительно будет список.
Разбивка на страницы обычно является завершением процесса, поэтому дополнительные вызовы ORM выглядят довольно странно. Более того, использование .values()
является чем-то вроде антипаттерна [django-антипаттерны].
Если вы хотите сначала выполнить перечисление по данным, выполните перечисление по клону набора запросов, таким образом:
for profile in unfiltered_list.all():
print('\n profile:', profile, '\n')