一.分页
试问如果当数据量特别大的时候,你是怎么解决分页的?
- 方式a、记录当前访问页数的数据id
- 方式b、最多显示120页等
- 方式c、只显示上一页,下一页,不让选择页码,对页码进行加密
1.基于limit offset 做分页
urls.py
url(r'^api/v1/', include('api.urls')),
api–>urls.py
url(r'^index1/',Indexview1.as_view()
views.py
from rest_framework.pagination import LimitOffsetPagination
class P1(LimitOffsetPagination):
default_limit = 2 # 设置每一页显示多少条
limit_query_param = 'limit' # 往后取几条
offset_query_param = 'offset' # 当前所在的位置,按索引
max_limit = 3
class Indexview1(APIView):
def get(self,request,*args,**kwargs):
role_list=models.Role.objects.all()
p1=P1() #注册分页
page_role_list=p1.paginate_queryset(queryset=role_list, request=request, view=self)
print('打印的是分页的数据',page_role_list)
ser=PagerSerializer(instance=page_role_list,many=True)
# return Response(ser.data)
return p1.get_paginated_response(ser.data)
2.基于页码的分页
api–.urls.py
url(r'^index2/',views.IndexView2.as_view()
views.py
from rest_framework.pagination import PageNumberPagination
class P2(PageNumberPagination):
page_size = 3 #默认每页显示的数据条数
page_query_param = 'page' #获取url中传入的页码key
page_size_query_param = 'size' #获取url参数中设置的每页显示数据条数
max_page_size = 4
class IndexView2(APIView):
def get(self,request):
role_list=models.Role.objects.all()
p2=P2()
page_role_list=p2.paginate_queryset(queryset=role_list, request=request,view=self)
ser=PagerSerializer(instance=page_role_list,many=True)
print('打印的是分页数据',page_role_list)
return p2.get_paginated_response(ser.data)
3.基于Cursor的分页
api–>urls.py
url(r'^index3/',views.IndexView3.as_view()
views.py
from rest_framework.pagination import CursorPagination
class P3(CursorPagination):
cursor_query_param = 'cursor' # URL传入的游标参数
page_size = 2 # 默认每页显示的数据条数
ordering = 'id' # 根据ID从小到大排列
page_size_query_param = 'size' # URL传入的每页显示条数的参数
# 每页显示数据最大条数
max_page_size = 3
class IndexView3(APIView):
def get(self,request):
role_list=models.Role.objects.all().order_by('id')
p3=P3()
page_role_list=p3.paginate_queryset(queryset=role_list, request=request,view=self)
print('打印的是分页的数据', page_role_list)
ser=PagerSerializer(instance=page_role_list,many=True)
return p3.get_paginated_response(ser.data)
二.视图
写视图函数可继承的几个类,我们以前经常用到的是APIView,现在我们来了解一下其他的类,其中1、3、4用到的最多
需要导入的类
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import GenericViewSet
from rest_framework.viewsets import ModelViewSet
1.APIView
class IndexView2(APIView):
def get(self,request,*args,**kwargs):
user_list = models.UserInfo.objects.all()
ser = MySerializes(instance=user_list,many=True)
return Response(ser.data)
2.GenericAPIView(APIView)
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from app01 import models
from app01.serializes.myserializes import MySerializes
from rest_framework.pagination import LimitOffsetPagination
class P1(LimitOffsetPagination):
max_limit = 3 # 最大限制默认是None
default_limit =2 # 设置每一页显示多少条
limit_query_param = 'limit' # 往后取几条
offset_query_param = 'offset' # 当前所在的位置
class IndexView1(GenericAPIView):
queryset = models.UserInfo.objects.all()
serializer_class = MySerializes
pagination_class = P1
def get(self,request,*args,**kwargs):
user_list = self.get_queryset()
p1 = P1() #注册分页
data = p1.paginate_queryset(queryset=user_list,request=request,view=self) #获取分页的数据
ser = self.get_serializer(instance=data,many=True) #序列化
return Response(ser.data)
3. GenericViewSet(ViewSetMixin, generics.GenericAPIView)
增
POST
/users/
删
DELETE
/users/1/
改 #全部修改
PUT
/users/1/
#局部修改
patch
/users/1/
查
GET
/users/
GET
/users/1/
在GET请求的时候如果带ID说明查一条,如果不带则查所有
原始的
urls.py:
urlpatterns = [
url(r'^index/$', views.IndexView.as_view()),
url(r'^index/(?P<pk>\d+)$', views.IndexView.as_view()),
]
views.py
class IndexView(views.APIView):
def get(self,request,*args,**kwargs):
pk = kwargs.get('pk')
if pk:
pass # 获取单条信息
else:
pass # 获取列表信息
def post(self,request,*args,**kwargs):
pass
def put(self,request,*args,**kwargs):
pass
def patch(self,request,*args,**kwargs):
pass
def delete(self,request,*args,**kwargs):
pass
用了GenericViewSet这种方式的时候注意url变了
urls.py:
urlpatterns = [
url(r'^index3/$', views.IndexView3.as_view({'get': 'list','post':'create'})),
url(r'^index3/(?P<pk>\d+)/$', views.IndexView3.as_view({'get': 'retrieve'})),
]
views.py:
class IndexView3(GenericViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = MySerializes
pagination_class = P1
def list(self,request,*args,**kwargs):
#获取列表信息
return Response('...')
def retrieve(self,request,*args,**kwargs):
#获取单条数据
return Response('xxx')
]
4.ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet)
利用ModelViewSet增删改查不用自己写了,内部把增删改查都干了,当满足不了需求的时候我们也可以自定制
urls.py:
urlpatterns = [
url(r'^index4/', views.IndexView4.as_view({'get': 'list','post':'create'})), #获取数据和添加数据
url(r'^index4\.(?P<format>[a-z0-9]+)/', views.IndexView4.as_view({'get': 'list','post':'create'})), #.json想让页面上显示成json格式
url(r'^index4/(?P<pk>\d+)/', views.IndexView4.as_view({'get': 'retrieve', 'delete': 'destroy','put':'partial_update'})), #查看单条,删除,修改数据
url(r'^index4(?P<pk>\d+)\.(?P<format>[a-z0-9]+)/', views.IndexView4.as_view({'get': 'retrieve', 'delete': 'destroy','put':'partial_update'})),
]
views.py:
注意啦:用ModelSerializer这种方法必须要用IndexSerializer(ModelSerializer)这种方式序列化
class P2(PageNumberPagination):
page_size = 3 #每一页显示的条数
page_query_param = 'page' #获取参数中传入的页码
page_size_query_param = 'size' #获取url参数中每页显示的数据条数
max_page_size = 5
class IndexSerializer(ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class IndexView4(ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = P2
自定制
class P2(PageNumberPagination):
page_size = 3 #每一页显示的条数
page_query_param = 'page' #获取参数中传入的页码
page_size_query_param = 'size' #获取url参数中每页显示的数据条数
max_page_size = 5
class IndexSerializer(ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class IndexView4(ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = IndexSerializer
pagination_class = P2
def list(self, request, *args, **kwargs):
'''获取get请求的所有'''
pass
def retrieve(self, request, *args, **kwargs):
'''查看单条数据'''
pass
def destroy(self, request, *args, **kwargs):
'''删除DELETE'''
pass
def create(self, request, *args, **kwargs):
'''添加数据POST'''
pass
def update(self, request, *args, **kwargs):
'''全部修改PUT'''
pass
def partial_update(self, request, *args, **kwargs):
'''局部修改PATCH'''
pass
继承关系