📅  最后修改于: 2023-12-03 14:40:45.959000             🧑  作者: Mango
在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条且带有next
和previous
链接的分页类:
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()
方法,以添加next
和previous
链接。
以上就是Django APIView 分页的基本用法,不仅可以使用自带的分页模块,还可以自定义分页类来实现更多自定义的功能。