原生Django也给我们提供了分页paginator
在DRF中为我们展示了三种分页的做法
<wiz_code_mirror>
x
1
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
1、PageNumberPagination
例如:http://127.0.0.1:8000/api/article/?page=2&size=1
这种最为常见,看第N页,每页显示M条数据
首先也是定义分页类
<wiz_code_mirror>
8
1
from rest_framework.pagination import PageNumberPagination
2
3
4
class MyPageNumber(PageNumberPagination):
5
page_size = 8 # 每页显示多少条
6
page_size_query_param = 'size' # URL中每页显示条数的参数
7
page_query_param = 'page' # URL中页码的参数
8
max_page_size = 8 # 最大页码数限制
视图1、对于APIView进行的封装
<wiz_code_mirror>
10
1
class ArticleList(APIView):
2
def get(self, request, *args, **kwargs):
3
res = {"code": 1000}
4
article_list = models.Article.objects.all().order_by("id")
5
# 分页
6
page_obj = MyPageNumber()
7
page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
8
ser_obj = ArticleSerializer(page_article, many=True) # 注意这里的传参已经变了
9
res["data"] = ser_obj.data
10
return Response(res)
视图2、对于ViewSet进行封装的视图
<wiz_code_mirror>
4
1
class PublishesViewSet(viewsets.ModelViewSet):
2
queryset = Publish.objects.all()
3
serializer_class = PublishModelSerializer
4
pagination_class = MyPageNumber # 就是加上这句代码
也可一加在全局
<wiz_code_mirror>
x
1
page_size = 8 # 每页显示多少条
2
page_size_query_param = 'size' # URL中每页显示条数的参数
3
page_query_param = 'page' # URL中页码的参数
4
max_page_size = 8 # 最大页码数限制
5
6
# 照着上面的写
7
REST_FRAMEWORK = {
8
'PAGE_SIZE': 2
9
}
2、LimitOffsetPagination
例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2
这种见的不多
在第N个位置往后偏移查看第M条数据
分页类
<wiz_code_mirror>
6
1
# offset分页
2
class MyLimitOffset(LimitOffsetPagination):
3
default_limit = 8
4
limit_query_param = 'limit'
5
offset_query_param = 'offset'
6
max_limit = 8
视图1、APIview
<wiz_code_mirror>
10
1
class ArticleList(APIView):
2
def get(self, request, *args, **kwargs):
3
res = {"code": 0}
4
article_list = models.Article.objects.all().order_by("id")
5
# 分页
6
page_obj = MyLimitOffset()
7
page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)
8
ser_obj = ArticleSerializer(page_article, many=True)
9
res["data"] = ser_obj.data
10
return page_obj.get_paginated_response(res)
视图2、Viewset
<wiz_code_mirror>
4
1
class PublishesViewSet(viewsets.ModelViewSet):
2
queryset = Publish.objects.all()
3
serializer_class = PublishModelSerializer
4
pagination_class = MyLimitOffset # 就是加上这句代码
代码一样
全局配置的参数当然也要改一下
<wiz_code_mirror>
1
default_limit = 8
2
limit_query_param = 'limit'
3
offset_query_param = 'offset'
4
max_limit = 8
5
6
# 照着上面的写
7
REST_FRAMEWORK = {
8
'default_limit': 8
9
...
10
}
分页也就到此结束了!
可以同Django原生的分页做个对比