django restframework框架七 分頁
@(python之路)[django restframework框架七 分頁]
django restframework框架七 分頁
目錄
分頁組件
a. 根據頁碼進行分頁
urls.py
from django.conf.urls import url, include
from rest_framework import routers
from app01 import views
urlpatterns = [
url(r'^page/', views.UserViewSet.as_view()),
]
views.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from rest_framework.views import APIView
from rest_framework import serializers
from .. import models
from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
# 默認每頁顯示的數據條數
page_size = 1
# 獲取URL參數中設置的每頁顯示數據條數
page_size_query_param = 'page_size'
# 獲取URL參數中傳入的頁碼key
page_query_param = 'page'
# 最大支持的每頁顯示的數據條數
max_page_size = 1
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class UserViewSet(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all().order_by('-id')
# 實例化分頁對象,獲取數據庫中的分頁數據
paginator = StandardResultsSetPagination()
page_user_list = paginator.paginate_queryset(user_list, self.request, view=self)
# 序列化對象
serializer = UserSerializer(page_user_list, many=True)
# 生成分頁和數據
response = paginator.get_paginated_response(serializer.data)
return response
b. 位置和個數進行分頁
urls.py
from django.conf.urls import url, include
from web.views import s9_pagination
urlpatterns = [
url(r'^test/', s9_pagination.UserViewSet.as_view()),
]
views.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from rest_framework.views import APIView
from rest_framework import serializers
from .. import models
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
class StandardResultsSetPagination(LimitOffsetPagination):
# 默認每頁顯示的數據條數
default_limit = 10
# URL中傳入的顯示數據條數的參數
limit_query_param = 'limit'
# URL中傳入的數據位置的參數
offset_query_param = 'offset'
# 最大每頁顯得條數
max_limit = None
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class UserViewSet(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all().order_by('-id')
# 實例化分頁對象,獲取數據庫中的分頁數據
paginator = StandardResultsSetPagination()
page_user_list = paginator.paginate_queryset(user_list, self.request, view=self)
# 序列化對象
serializer = UserSerializer(page_user_list, many=True)
# 生成分頁和數據
response = paginator.get_paginated_response(serializer.data)
return response
c. 游標分頁
urls.py
from django.conf.urls import url, include
from web.views import s9_pagination
urlpatterns = [
url(r'^test/', s9_pagination.UserViewSet.as_view()),
]
views.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from rest_framework.views import APIView
from rest_framework import serializers
from .. import models
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
class StandardResultsSetPagination(CursorPagination):
# URL傳入的游標參數
cursor_query_param = 'cursor'
# 默認每頁顯示的數據條數
page_size = 2
# URL傳入的每頁顯示條數的參數
page_size_query_param = 'page_size'
# 每頁顯示數據最大條數
max_page_size = 1000
# 根據ID從大到小排列
ordering = "id"
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class UserViewSet(APIView):
def get(self, request, *args, **kwargs):
user_list = models.UserInfo.objects.all().order_by('-id')
# 實例化分頁對象,獲取數據庫中的分頁數據
paginator = StandardResultsSetPagination()
page_user_list = paginator.paginate_queryset(user_list, self.request, view=self)
# 序列化對象
serializer = UserSerializer(page_user_list, many=True)
# 生成分頁和數據
response = paginator.get_paginated_response(serializer.data)
return response
源碼分析
?這里的源碼比較簡單,我們不在解說。
?我們要更加關注與思維方式,可以說rest framework的源碼寫的非常漂亮。我們要關注的點有,繼承、反射、默認配置文件定義、類的封裝和列表生成式等。
?還需要注意一點分析入口self.dispath入口。

浙公網安備 33010602011771號