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



背景

我当前使用的是定义了get_queryset的ModelViewSet控制器。对get_queryset的查询返回与给定资源相关联的所有对象。例如,系统中所有用户的列表。这对于琐碎的使用来说非常好,因为总是返回完整的列表,通过默认的分页方法进行分页,然后按预期返回给请求者。

原因

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

问题

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

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

相反,在第一个请求中,我只想查询前25个用户(使用LIMIT和OFFSET之类的方法),然后将结果与总计数一起提供,这样分页方法就可以提供正确的next、previor和count属性。然后在第二个请求中,我想使用请求信息来更新LIMIT和OFFSET,并返回下一个25。

调查

我知道编写自定义分页类的能力,但我想知道是否有一些现有的过程可以实现这一点。

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

它应该已经像您所描述的那样工作了——使用LIMIT和OFFSET只从数据库中获取列表的第一页,并使用count()计算记录总数。

如果您的休息分页配置设置不正确,这里会详细描述,应该非常直接。如果将?page=1参数传递给视图,它应该会按预期工作。

(为了不猜测正在执行的查询,您可以安装django调试工具栏并查看原始sql。)

相关内容

最新更新