1

我在 Django 中有一个通用列表视图,它返回大约 300 个对象(除非执行搜索)。

我将分页设置为仅显示 10 个对象。

所以我查询数据库,然后遍历对象,处理它们并在显示之前添加额外的值。我注意到所有 300 个对象都完成了处理,并且在处理后完成了分页。所以我只想对要显示的对象进行处理以提高性能。

我计算查询集中应该处理的对象的索引,第 1 页的 0-10、第 2 页的 11-20、第 3 页的 21-30 等。

现在我只想处理显示范围内的对象,但返回完整的查询集(因此类型视图按预期工作)。

最初我尝试过:

for object in queryset[slice_start:slice_end] :
     # process things here

return queryset

但是切片似乎返回了一个新的查询集,而原始查询集对象没有任何计算值。

目前我的解决方案是:

index = -1
for object in queryset:
     index += 1   
     if index < slice_start or index > slice_end : continue
     # process things here
return queryset 

现在这可行,但对于 Python 来说似乎相当 hacky 和不优雅。有没有更蟒蛇的方式来做到这一点?

4

2 回答 2

2

如果您使用的是 Django 的Paginator类 ( docs ),那么您可以请求当前页面并遍历视图中的这些对象:

from django.core.paginator import Paginator

# in the view:
p = Paginator(objects, 2)
page = p.page(current_page)
for o in page.object_list:
    # do processing
    pass

您可以current_page从请求的参数(例如,中的page参数request.GET)中获取值。

于 2012-06-13T10:07:50.517 回答
1

您应该对 的结果进行处理page.object_list,这将保证只包含该页面的对象。

于 2012-06-13T10:08:52.130 回答