繁体   English   中英

只处理Django中查询集的子集(并返回原​​始查询集)

[英]Only process subset of a queryset in Django (and return original queryset)

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

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

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

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

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

最初我尝试过:

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 

现在这个工作,但它似乎相当hacky,并且对于Python来说不​​够优雅。 是否有更多的pythonic方式来做到这一点?

如果您正在使用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的值(例如, request.GETpage参数)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM