Страница 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')
Вернуться на верх