為什麼要使用分頁 我們數據表中可能會有成千上萬條數據,當我們訪問某張表的所有數據時,我們不太可能需要一次把所有的數據都展示出來,因為數據量很大,對服務端的記憶體壓力比較大還有就是網路傳輸過程中耗時也會比較大。 通常我們會希望一部分一部分去請求數據,也就是我們常說的一頁一頁獲取數據並展示出來。 分頁的三 ...
為什麼要使用分頁
我們數據表中可能會有成千上萬條數據,當我們訪問某張表的所有數據時,我們不太可能需要一次把所有的數據都展示出來,因為數據量很大,對服務端的記憶體壓力比較大還有就是網路傳輸過程中耗時也會比較大。
通常我們會希望一部分一部分去請求數據,也就是我們常說的一頁一頁獲取數據並展示出來。
分頁的三種方式
方式一:基本的分頁,就是正常的查第幾頁每頁顯示多少條
model.py
from django.db import models
# Create your models here.
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32)
publish = models.CharField(max_length=32)
def __str__(self):
return self.name
serializer.py
from rest_framework import serializers
from .models import Book, Publish
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
page.py
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
class CommonPageNumberPagination(PageNumberPagination):
# 有4個類屬性
# 每頁顯示條數
page_size = 2
# 分頁查詢的那個參數 ?page=10
page_query_param = 'page'
# ?page=3&size=3 查詢3頁,每頁查詢3條
page_size_query_param = 'size'
# 可以通過size控制每頁顯示的條數,但是通過這個參數控制最多顯示多少條
max_page_size = 3
view.py
from django.shortcuts import render
# Create your views here.
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.viewsets import ViewSetMixin
from app01.models import Book
from app01.serializer import BookSerializer
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
# as 後面是起的別名,將我們寫的類導入進來
from .page import CommonPageNumberPagination as PageNumberPagination
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
# pagination_class後面是我們自己寫的類,只不過在導入的時候我們重新命名了
pagination_class = PageNumberPagination
方式二:偏移分頁:可以直接從第幾頁第幾個位置開始拿數據 offset=6&limit=2
page.py
class CommonLimitOffsetPagination(LimitOffsetPagination):
# 每頁顯示多少條
default_limit = 2
# 可以直接從第幾頁第幾個位置開始拿數據 offset=6&limit=2
limit_query_param = 'limit' # 取多少條
# 從第0個位置偏移多少開始取數據
offset_query_param = 'offset'
# 最大限制條數
max_limit = 5
view.py
from .page import CommonLimitOffsetPagination
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = CommonLimitOffsetPagination
方式三:游標分頁式分頁
效率高,但是可控性差,只能選擇上一頁與下一頁,不能直接跳轉到某一頁,這種針對於大數據
page.py
class CommonCursorPagination(CursorPagination):
# 查詢的名字
cursor_query_param = 'cursor'
# 每頁顯示多少條
page_size = 3
# 必須是表中有的欄位,一般用id
ordering = 'id'
view.py
from .page import CommonCursorPagination
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
pagination_class = CommonCursorPagination