07,分页

原生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原生的分页做个对比

猜你喜欢

转载自www.cnblogs.com/pontoon/p/10217431.html
07
今日推荐