rest-framework分页
一、使用rest-framework
返回json
数据格式
1、导包
from rest_framework.response import Response
2、直接使用序列化后的数据返回
from rest_framework.response import Response class RoleSerializer3(serializers.ModelSerializer): class Meta(object): model = models.RoleModel fields = '__all__' class RoleView3(APIView): def get(self, request, *args, **kwargs): roles = models.RoleModel.objects.all() ser = RoleSerializer3(instance=roles, many=True) return Response(ser.data)
二、使用内置分页插件
1、导包
from rest_framework.pagination import PageNumberPagination
2、在
settings.py
中配置一页显示多少条数据REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'], 'PAGE_SIZE': 2, # 表示一页显示2条数据 }
3、在视图类中使用
from rest_framework.pagination import PageNumberPagination class RoleSerializer3(serializers.ModelSerializer): class Meta(object): model = models.RoleModel fields = '__all__' class RoleView3(APIView): def get(self, request, *args, **kwargs): # 获取全部的数据 roles = models.RoleModel.objects.all() # 创建一个分页对象 pg = PageNumberPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 序列化 ser = RoleSerializer3(instance=pager_roles, many=True) return Response(ser.data)
4、我们请求的
url
地址# 如果是第一页可以是 http://127.0.0.1:9000/app01/api/v1/role3/ http://127.0.0.1:9000/app01/api/v1/role3/?page=2
三、自定义分页类(继承PageNumberPagination
类)
1、自定义分页类
class MyPageNumberPagination(PageNumberPagination): page_size = 3 page_size_query_param = 'size' # 一页多少条数据 max_page_size = 5 page_query_param = 'page' # 显示第几页
2、在视图中使用
class RoleView3(APIView): def get(self, request, *args, **kwargs): # 获取全部的数据 roles = models.RoleModel.objects.all() # 创建一个分页对象 pg = MyPageNumberPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 序列化 ser = RoleSerializer3(instance=pager_roles, many=True) return Response(ser.data)
四、使用limitOffsetPagination
进行分页
1、导包
from rest_framework.pagination import LimitOffsetPagination
2、自定义类
class MyPageNumberPagination(LimitOffsetPagination): default_limit = 3 # 默认取3条数据 limit_query_param = 'limit' # 可以自定义显示多少条 xxx?limit=4&offset=1 offset_query_param = 'offset' # 偏移多少 max_limit = 5
3、视图类中使用
class RoleView3(APIView): def get(self, request, *args, **kwargs): # 获取全部的数据 roles = models.RoleModel.objects.all() # 创建一个分页对象 pg = MyPageNumberPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 序列化 ser = RoleSerializer3(instance=pager_roles, many=True) return Response(ser.data)
4、
url
地址http://127.0.0.1:9000/app01/api/v1/role3/?offset=4&limit=3
五、显示上一页下一页
1、只要在视图类中使用
class RoleView3(APIView): def get(self, request, *args, **kwargs): # 获取全部的数据 roles = models.RoleModel.objects.all() # 创建一个分页对象 pg = MyPageNumberPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 序列化 ser = RoleSerializer3(instance=pager_roles, many=True) # return Response(ser.data) # 使用分页插件里面的会显示上一页下一页 return pg.get_paginated_response(ser.data)
六、加密分页(上一页下一页没规律)
1、导包
from rest_framework.pagination import CursorPagination
2、自定义类继承
class MyPageNumberPagination(CursorPagination): cursor_query_param = 'cursor' page_size = 2 ordering = 'id' page_size_query_param = None max_page_size = None
七、全局配置
1、全局配置
REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'], 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 4 }
2、在视图中直接使用
class RoleView3(APIView): def get(self, request, *args, **kwargs): # 获取全部的数据 roles = models.RoleModel.objects.all() # 创建一个分页对象 pg = LimitOffsetPagination() # 在数据库中获取分页的数据 pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self) # 序列化 ser = RoleSerializer3(instance=pager_roles, many=True) # return Response(ser.data) return pg.get_paginated_response(ser.data)
八、总结
情景一、如果仅仅是想使用分页(默认分页与配置就可以)
1、在
settings.py
中配置REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser'], 'PAGE_SIZE': 10, # 一页显示多少条数据 }
2、在视图类中定义使用
from rest_framework.pagination import PageNumberPagination class GoodsCategoryView(ListModelMixin, GenericViewSet): """ 配置商品分类的视图 """ queryset = models.GoodsCategoryModel.objects.all() serializer_class = serializers.GoodsCategorySerializer # 配置分页的类 pagination_class = PageNumberPagination
情景二、需要自己配置点参数(重写类)
1、继承
PageNumberPagination
类class Page(PageNumberPagination): page_size = 10 # 表示从多少页开始 page_size_query_param = 'size' page_query_param = 'p' max_page_size = 100
2、使用自定义的类
class GoodsCategoryView(ListModelMixin, GenericViewSet): """ 配置商品分类的视图 """ queryset = models.GoodsCategoryModel.objects.all() serializer_class = serializers.GoodsCategorySerializer pagination_class = Page