我正在尝试用 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 循环,代码运行正常,但当我尝试循环遍历未筛选的列表时,“profiles”会变成一个列表,即使我除了创建一个引用它的变量之外没有修改过它。我收到一个属性错误,提示“AttributeError: ‘list’ object has no attribute ‘values’”。
这是Django本身的问题吗?还是我忽略了什么?
确实如此,发生这种情况的原因是因为Django
Paginator
对查询集进行了切片 [GitHub],确实如此:QuerySet
如果原始文件QuerySet
没有,这将返回一个result_cache
。但如果
QuerySet
已将结果加载到内存中,它会返回切片结果缓存 [GitHub],确实如此:由于
._result_cache
是结果列表,因此结果确实是一个列表。分页通常是流程的结束,因此额外的 ORM 调用会显得很奇怪。此外,使用[django-antipatterns]
.values()
也有点违反反模式 。如果您想要首先枚举数据,请枚举查询集的克隆,因此:
注意:我为此创建了一张票 [Django-ticket],一个想法是,如果数据已经被获取,它仍然会创建一个
QuerySet
但带有填充结果缓存的缓存。