这是我参与更文挑战的第18天,活动详情查看: 更文挑战前端
分页有三种方式数据库
from django.conf.urls import url, include
from django.urls import path
urlpatterns = [
url(r'^api/', include('api.urls')),
]
复制代码
from django.conf.urls import url, include, re_path
from api import views
urlpatterns = [
re_path(r'^(?P<version>v\d)/users/$', views.UserView.as_view(), name='user'),
]
复制代码
在不使用django rest framework
中的分页组件仍可以达到目的django
from rest_framework.views import APIView
from rest_framework import serializers
from api.models import UserInfo
from rest_framework.pagination import PageNumberPagination
class MyUserSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo # models类名
# 方法一:生成全部数据库字段
fields = "__all__"
class UserView(APIView):
def get(self, request, *args, **kwargs):
# 1 获取全部数据
users = UserInfo.objects.all()
ser = MyUserSerializer(instance=users, many=True)
return HttpResponse(ser.data)
复制代码
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 2
max_page_size = 5
page_size_query_param = 'size'
page_query_param = 'page'
复制代码
class PagerSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = "__all__"
class MyPageNumberPagination(PageNumberPagination):
page_size = 2
page_size_query_param = "size"
max_page_size = 5
page_query_param = "page"
class UserView(APIView):
def get(self, request, *args, **kwargs):
# 1 获取全部数据
users = UserInfo.objects.all()
# 2 建立分页对象
pg = MyPageNumberPagination()
# 3 在数据库获取分页数据
users_info = pg.paginate_queryset(queryset=users, request=request, view=self)
# 4 对数据进行序列化
ser = MyUserSerializer(instance=users_info, many=True)
# return Response(ser.data)
return pg.get_paginated_response(ser.data)
复制代码
from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
复制代码
class MyUserSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo # models类名
# 方法一:生成全部数据库字段
fields = "__all__"
class MyPageNumberPagination(LimitOffsetPagination):
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
class UserView(APIView):
def get(self, request, *args, **kwargs):
# 1 获取全部数据
users = UserInfo.objects.all()
# 2 建立分页对象
pg = MyPageNumberPagination()
# 3 在数据库获取分页数据
users_info = pg.paginate_queryset(queryset=users, request=request, view=self)
# 4 对数据进行序列化
ser = MyUserSerializer(instance=users_info, many=True)
# return Response(ser.data)
return pg.get_paginated_response(ser.data)
复制代码
若是使用普通分页时,因为向用户提供了可选参数
page
,用户能够直接跳到数据分页以后的任意页码。可是这样作的后果就是,数据库的负载变大,返回结果的效率缓慢。可是一旦使用加密以后,虽然提供可选参数cursor
,可是对页码进行加密,用户没法知道当前页,而是以上一页下一页的方式翻阅数据。有效避免了数据库的负荷。可是就须要向用户提供上一页下一页的url
。api
from rest_framework.pagination import LimitOffsetPagination
class MyCursorPagination(CursorPagination):
ordering = 'id'
复制代码
class MyUserSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo # models类名
# 方法一:生成全部数据库字段
fields = "__all__"
class MyPageNumberPagination(CursorPagination):
ordering = 'id'
class UserView(APIView):
def get(self, request, *args, **kwargs):
# 1 获取全部数据
users = UserInfo.objects.all()
# 2 建立分页对象
pg = MyPageNumberPagination()
# 3 在数据库获取分页数据
users_info = pg.paginate_queryset(queryset=users, request=request, view=self)
# 4 对数据进行序列化
ser = MyUserSerializer(instance=users_info, many=True)
# return Response(ser.data)
return pg.get_paginated_response(ser.data)
复制代码
pg.get_paginated_response(ser.data)
作返回三种分页中,普通分页与django中的分页基本没有区别。不过要作分页返回给前端数据,就要从数据库中取出数据,而后在作分页序列化。若是用户一下在前几页请求数据库中的最后几页数据,对查询数据库的时延,对数据库的负载较大,就会出现问题,这个时候就可使用加密分页,限制用户的访问,只提供前一页和后一页的接口。markdown