為什么要使用分頁
我們資料表中可能會有成千上萬條資料,當我們訪問某張表的所有資料時,我們不太可能需要一次把所有的資料都展示出來,因為資料量很大,對服務端的記憶體壓力比較大還有就是網路傳輸程序中耗時也會比較大,
通常我們會希望一部分一部分去請求資料,也就是我們常說的一頁一頁獲取資料并展示出來,
分頁的三種方式
方式一:基本的分頁,就是正常的查第幾頁每頁顯示多少條
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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518834.html
標籤:Python
