Estou tentando criar um site matrimonial no Django. O código a seguir mostra um único perfil por vez.
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')
O código funciona bem se eu remover o loop for, mas quando tento percorrer a lista não filtrada, "profiles" se torna uma lista, mesmo que eu não tenha mexido nela, exceto pela criação de uma variável que a referencia. Recebo um erro de atributo dizendo AttributeError: o objeto "list" não tem o atributo "values".
Isso é um problema com o próprio Django? Ou estou esquecendo de algo?
Este é realmente o caso, a razão pela qual isso acontece é porque o
Paginator
Django divide o queryset [GitHub] , na verdade:e isso retornará um
QuerySet
se o originalQuerySet
não tiverresult_cache
.Mas se
QuerySet
tiver resultados carregados na memória, ele retorna o cache de resultados fatiado [GitHub] , de fato:como
._result_cache
é uma lista de resultados, o resultado será de fato uma lista.A paginação normalmente é o fim do processo, então chamadas extras de ORM são bem estranhas. Além disso, usar [django-antipatterns]
.values()
é um pouco antipadrão .Se você quiser primeiro enumerar os dados, enumere um clone do conjunto de consultas, então:
NB : Criei um tíquete [Django-ticket] para isso. Uma ideia seria que, caso os dados já tenham sido buscados, ele ainda criasse um,
QuerySet
mas com um cache de resultados preenchido.