📜  Django APIView 分页 - Python (1)

📅  最后修改于: 2023-12-03 14:40:45.959000             🧑  作者: Mango

Django APIView 分页 - Python

在Django中开发API时,很常见需要对返回的数据进行分页处理。Django提供了很多针对分页的模块和方法,其中最常用的是rest_framework模块中的Pagination

安装rest_framework

在Django项目中安装rest_framework模块:

pip install djangorestframework

然后将其加入INSTALLED_APPS以使它生效,再在settings.py中添加:

INSTALLED_APPS = [
    # ...
    'rest_framework',
]
使用Pagination对数据进行分页处理

创建API视图并继承自APIView类,随后在其中添加get()方法来实现GET请求的处理。然后导入Pagination模块并实例化:

from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
    page_size = 10
    page_query_param = 'page'
  • page_size:每页显示的记录数。
  • page_query_param:表示传递页数的参数名称。

最后在get()方法中使用paginate_queryset()方法来对获取的数据进行分页处理:

class MyView(APIView):
    def get(self, request):
        queryset = MyModel.objects.all()
        pagination_queryset = MyPagination().paginate_queryset(queryset=queryset, request=request, view=self)
        serializer_data = MySerializer(pagination_queryset, many=True).data
        return Response(serializer_data)

paginate_queryset()方法会根据传递的queryset、请求request和视图view参数对数据进行分页处理,最后返回分页后的数据。随后可以对这些数据进行序列化并返回给客户端。

自定义分页类

如果想要自定义分页的实现方式,可以创建自己的分页类并继承自Pagination类,然后在其中实现自己的分页逻辑。例如,实现一个每页显示5条且带有nextprevious链接的分页类:

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

class MyPagination(PageNumberPagination):
    page_size = 5
    page_query_param = 'page'
    page_size_query_param = 'page_size'

    def get_paginated_response(self, data):
        return Response({
            'next': self.get_next_link(),
            'previous': self.get_previous_link(),
            'count': self.page.paginator.count,
            'results': data
        })

这里重写get_paginated_response()方法,以添加nextprevious链接。

结论

以上就是Django APIView 分页的基本用法,不仅可以使用自带的分页模块,还可以自定义分页类来实现更多自定义的功能。