Django REST框架仅返回分页所需的对象&总数

时间:2016-04-12 02:17:40

标签: python django rest pagination django-rest-framework

背景

我目前正在使用定义了get_queryset的ModelViewSet控制器。 get_queryset的查询返回与给定资源关联的所有对象。例如,系统中所有用户的列表。这非常适合琐碎的用法,因为始终返回完整列表,由默认的分页方法分页,然后按预期返回到请求者。

原因

随着我们的数据集变得越来越大,似乎没有必要查询给定端点的所有对象,将它们加载到列表中,然后对每个页面加载列表进行分页。

问题

是否有任何功能只返回请求所针对的给定页面所需的对象?

例如,假设有一个页面大小为25的第一页请求。目前我们查询数据库中的所有用户,对该列表进行分页,然后返回前25个对象。然后另一个请求进入第二页。我们必须再次查询所有用户,对列表进行分页,然后返回第二个25个对象。

相反,在第一个请求中,我只想查询前25个用户(使用LIMIT和OFFSET之类的东西),然后提供该结果以及总计数,以便分页方法可以提供正确的下一个,之前的,并计算属性。然后在第二个请求中,我想使用请求信息更新LIMIT和OFFSET并返回下一个25。

研究

我知道写custom Pagination class的能力,但我想知道是否有一些现有的实现此过程。

1 个答案:

答案 0 :(得分:2)

除非我误解了这个问题,否则听起来你会被queryset = User.objects.all()弄糊涂。此行不会查询数据库中的所有用户,因为query sets are lazy

它应该已经按照您的描述工作了 - 使用LIMIT和OFFSET从数据库中获取列表的第一页,并使用COUNT()计算记录总数。

如果您的其他分页配置设置不正确,则详细描述here,应该非常简单。如果您将?page=1 param传递给您的视图,它应该按预期工作。

(为了不猜测正在执行哪些查询,您可以安装django debug toolbar并查看原始sql。)