分页
- 分页,看第n页,每页显示n条数据
- 分页,在某个位置,向后查看n条数据
- 加密分页,只让看上一页和下一页(查询速度快)
基本使用
# url.py
from django.conf.urls import url
from api import views
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()),
]
# setting.py
REST_FRAMEWORK = {
# 分页配置
'PAGE_SIZE': 10 # 一页显示10条数据
}
# view.py
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework import serializers
from api import models
class PagerSerializers(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"
class Pager1View(APIView):
def get(self, request, *args, **kwargs):
# 获取所有数据
roles = models.Role.objects.all()
# 创建分页对象
pg = PageNumberPagination()
# pg = LimitOffsetPagination()
# pg = CursorPagination()
# 在数据库中获取分页的数据
pagers_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 对数据进行序列化
ser = PagerSerializers(instance=pagers_roles, many=True)
# response = pg.get_paginated_response(ser.data)
# return response
return Response(ser.data)
看第n页,每页显示n条数据
例如URL:http://127.0.0.1:8000/api/v1/pager1/?page=2&size=6
# url.py
from django.conf.urls import url
from api import views
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()),
]
# view.py
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework import serializers
from api import models
class PagerSerializers(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"
# 可义分页类,继承PageNumberPagination类
class MyPageNumberPagination(PageNumberPagination):
# 每页显示数据
page_size = 10
# 获取URL参数中传入的页码key
page_query_param = 'page'
# 获取URL参数中设置的每页显示数据条数,默认为None,表示每页显示数据以page_size值为准
page_size_query_param = 'size'
# 最大支持的每页显示的数据条数
max_page_size = 5
class Pager1View(APIView):
def get(self, request, *args, **kwargs):
# 获取所有数据
roles = models.Role.objects.all()
# 创建分页对象
pg = MyPageNumberPagination()
# 在数据库中获取分页的数据
pagers_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 对数据进行序列化
ser = PagerSerializers(instance=pagers_roles, many=True)
# response = pg.get_paginated_response(ser.data)
# return response
return Response(ser.data)
在某个位置,向后查看n条数据
例如URL:http://127.0.0.1:8000/api/v1/pager11/?limit=5&offset=1
# url.py
from django.conf.urls import url
from api import views
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()),
]
# view.py
from rest_framework.response import Response
from rest_framework.pagination import LimitOffsetPagination
from rest_framework import serializers
from api import models
class PagerSerializers(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"
class MyLimitOffsetPagination(LimitOffsetPagination):
# 默认每页显示的数据条数
default_limit = 10
# URL中传入的显示数据条数的参数
limit_query_param = 'limit'
# URL中传入的数据位置的参数
offset_query_param = 'offset'
# 最大每页显得条数
max_limit = None
class Pager1View(APIView):
def get(self, request, *args, **kwargs):
# 获取所有数据
roles = models.Role.objects.all()
# 创建分页对象
pg = MyLimitOffsetPagination()
# 在数据库中获取分页的数据
pagers_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 对数据进行序列化
ser = PagerSerializers(instance=pagers_roles, many=True)
# response = pg.get_paginated_response(ser.data)
# return response
return Response(ser.data)
游标分页(加密分页,只让看上一页和下一页)
例如URL:http://127.0.0.1:8000/api/v1/pager111/?cursor=cj0xJnA9MTE%3D
# url.py
from django.conf.urls import url
from api import views
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()),
]
# view.py
from rest_framework.response import Response
from rest_framework.pagination import CursorPagination
from rest_framework import serializers
from api import models
class PagerSerializers(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"
class MyCursorPagination(CursorPagination):
# URL传入的游标参数
cursor_query_param = 'cursor'
# 默认每页显示的数据条数
page_size = 10
# 根据ID从大到小排列
ordering = '-id'
# URL传入的每页显示条数的参数
page_size_query_param = 'size'
# 每页显示数据最大条数
max_page_size = 1000
class Pager1View(APIView):
def get(self, request, *args, **kwargs):
# 获取所有数据
roles = models.Role.objects.all()
# 创建分页对象
pg = MyCursorPagination()
# 在数据库中获取分页的数据
pagers_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 对数据进行序列化
ser = PagerSerializers(instance=pagers_roles, many=True)
response = pg.get_paginated_response(ser.data)
return response