Django rest framework--分页,视图,路由

一.分页

试问如果当数据量特别大的时候,你是怎么解决分页的?

  • 方式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

继承关系
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值