這是我參與更文挑戰的第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