rest_framework 分頁三種


1.分頁
    a. 分頁 看第n頁 每頁顯示n條數據:
    b. 分頁 在某個位置 向后查看多少條數據
    c. 加密分頁 上一頁和下一頁

    本質:查看 記住頁碼id的最大值和最小值 通過其來准確掃描
    過去的話 會從id 1到n掃描

    第一種分頁
api下的utils.serializers.pager.py
from rest_framework import serializers
from api import models
class PagerSerialiser(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = "__all__"

url里寫
from django.contrib import admin
from api import views
from django.conf.urls import url
urlpatterns = [
    url(r'^pager1/', views.Pager1View.as_view())
]


視圖里寫
from rest_framework.response import Response
from api.utils.serializers.pager import PagerSerialiser
from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size=2  #默認兩個
    page_size_query_param = 'size'  #傳一個size參數 一頁顯示多少  http://127.0.0.1:8000/pager1/?page=1&size=3
    max_page_size = 5  #一頁顯示最大5個

    page_query_param = 'page'  #頁碼



class Pager1View(APIView):

    def get(self,request, *args,**kwargs):
        #獲取所有數據
        roles = models.Role.objects.all()
        #創建分頁對象
        pg = MyPageNumberPagination()
        #在數據庫中獲取分頁數據
        pager_roles = pg.paginate_queryset(queryset=roles, request=request,view=self)

        print(pager_roles)
        #對分頁數據進行序列化
        ser = PagerSerialiser(instance=pager_roles, many=True)

        return pg.get_paginated_response(ser.data)  #返回上一頁或者下一頁


第二種分頁 索引值最大最小值分頁
視圖函數
from django.shortcuts import render,HttpResponse
import json
# Create your views here.
from rest_framework.views import APIView
from rest_framework import serializers
from api import models
class UserInfoserializer(serializers.ModelSerializer):

    group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk')
    class Meta:
        model = models.UserInfo
        # fields = '__all__'
        fields = ['group']
        depth = 0 #0到3 4層

class UserInfoView(APIView):
    def get(self,request, *arg, **kwargs):
        users = models.UserInfo.objects.all()
        ser = UserInfoserializer(instance=users, many=True,context={'request': request})  #必須添加 context = {'request':request}

        ret = json.dumps(ser.data, ensure_ascii = False)
        return HttpResponse(ret)



class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserGroup
        fields = '__all__'

class GroupView(APIView):

    def get(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        obj = models.UserGroup.objects.filter(pk=pk).first()

        ser = GroupSerializer(instance=obj, many=False)
        ret = json.dumps(ser.data,ensure_ascii=False)

        return HttpResponse(ret)

from rest_framework.response import Response
from api.utils.serializers.pager import PagerSerialiser
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size=2  #默認兩個
    page_size_query_param = 'size'  #傳一個size參數 一頁顯示多少  http://127.0.0.1:8000/pager1/?page=1&size=3
    max_page_size = 5  #一頁顯示最大5個

    page_query_param = 'page'  #頁碼

class MyPagenumber2Pagination(LimitOffsetPagination):
    default_limit = 3
    limit_query_param = 'limit'  #每頁多少條數據
    offset_query_param = 'offset'  #第幾個索引開始
    max_limit = 5

class Pager1View(APIView):

    def get(self,request, *args,**kwargs):
        #獲取所有數據
        roles = models.Role.objects.all()
        #創建分頁對象
        pg = MyPagenumber2Pagination()
        #在數據庫中獲取分頁數據
        pager_roles = pg.paginate_queryset(queryset=roles, request=request,view=self)

        print(pager_roles)
        #對分頁數據進行序列化
        ser = PagerSerialiser(instance=pager_roles, many=True)

        # return pg.get_paginated_response(ser.data)  #返回上一頁或者下一頁

        return Response(ser.data)


    分頁第三種:cursion

from rest_framework.response import Response
from api.utils.serializers.pager import PagerSerialiser
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

class MyPageNumberPagination(PageNumberPagination):
    page_size=2  #默認兩個
    page_size_query_param = 'size'  #傳一個size參數 一頁顯示多少  http://127.0.0.1:8000/pager1/?page=1&size=3
    max_page_size = 5  #一頁顯示最大5個

    page_query_param = 'page'  #頁碼

class MyPagenumber2Pagination(LimitOffsetPagination):
    default_limit = 3
    limit_query_param = 'limit'  #每頁多少條數據
    offset_query_param = 'offset'  #第幾個索引開始
    max_limit = 5

class MyPagenumber3Pagination(CursorPagination):
    cursor_query_param = 'cursor'
    page_size = 2
    ordering = 'id'
    page_size_query_param = None
    max_page_size = None

class Pager1View(APIView):

    def get(self,request, *args,**kwargs):
        #獲取所有數據
        roles = models.Role.objects.all()
        #創建分頁對象
        pg = MyPagenumber3Pagination()
        #在數據庫中獲取分頁數據
        pager_roles = pg.paginate_queryset(queryset=roles, request=request,view=self)

        print(pager_roles)
        #對分頁數據進行序列化
        ser = PagerSerialiser(instance=pager_roles, many=True)

        return pg.get_paginated_response(ser.data)  #返回上一頁或者下一頁

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM