我们通常在使用Django为前端或者用户提供接口的时候,时常会遇到返回大量数据信息的情况,比如:有1000条用户信息,有1000条新闻文章,有1000条商品信息等等。但是我们不可能将所有数据从数据库获取后一股脑的全部返回,这样相当不好,会增大服务器压力,同时也会增加前端渲染压力,也不方便前端或者用户使用。
这种情况下,我们就需要用到分页处理。顾名思义,就是将大量数据进行分页,每页只有少量数据,在用户希望通过接口获取数据时,只需要在url中加入指定的参数,就可以获取指定页的数据,使用相当方便。
在Django中,我们通常使用django-rest-framework这个插件进行分页,它提供了三种分页器:PageNumber分页(普通分页)、LimitOffset分页(偏移分页)、Cursor分页(加密分页),我们可以根据实际情况选择合适的分页器,下面来依次介绍这三种分页器。
一、PageNumber分页
class TestApi1(APIView):
"""PageNumber分页"""
def get(self, request):
page = PageNumberPagination() # 创建普通分页器对象
page.page_size = 3 # 设置每页数据条数
articles = Articles.get_articles() # 获取所有文章数据
ret_page = page.paginate_queryset(articles, request, self) # 用实例化的分页器对所有数据进行分页,并且返回当前页的数据的列表
articles_serializer = ArticlesSerializers(ret_page, many=True) # 将当前页数据序列化
data = {
'count': articles.count(), # 获取数据总数
'previous': page.get_previous_link(), # 获取上一页链接,如果没有则是None
'next': page.get_next_link(), # 获取下一页链接,如果没有则是None
'results': articles_serializer.data, # 当前页的序列化数据