天天看點

Django開源架構2023-6-10(分頁器)

作者:不易9093

一、Django預設分頁器

官方網站:官方網站https://docs.djangoproject.com/zh-hans/4.2/ref/paginator/

Django Paginator 頁面提供了有關分頁器對象的詳細資訊和示例。它解釋了什麼是分頁器,如何使用它們以及如何在 Django 應用程式中使用它們。

了解和認識:

在 Django 中,當您處理大量資料時,您需要一種方法來将資料分成多個頁面以便于顯示。這就是分頁器的用途。分頁器允許您将資料分成多個頁面,并在每個頁面上顯示指定數量的資料。

Django 中的分頁器使用 Python 标準庫中的 Paginator 類來實作。Paginator 類是一個工廠類,用于建立和管理分頁器對象。通過使用 Paginator 類,您可以輕松地将資料分成多個頁面,并在每個頁面上顯示指定數量的資料。

學習與應用:

要學習如何在 Django 應用程式中使用分頁器,您需要了解以下幾個步驟:

  1. 導入 Paginator 類:在您的視圖函數或模闆中導入 Paginator 類。例如:
from django.core.paginator import Paginator              
  1. 建立分頁器對象:使用 Paginator() 函數建立一個分頁器對象。例如:
paginator = Paginator(my_queryset, per_page=10)               

其中 my_queryset 是您要分頁的資料集,per_page 是每頁要顯示的資料量。

  1. 定義視圖函數或模闆:編寫一個視圖函數或模闆來處理分頁器請求。您需要使用 GET 或 POST 請求來擷取分頁器參數,并将資料集傳遞給分頁器對象。例如:
def my_view(request):
    queryset = MyModel.objects.all()
    pagination_data = request.GET.get('pagination', {})
    paginator = Paginator(queryset, per_page=int(pagination_data.get('per_page', 10)))
    page_number = request.GET.get('page') or 1
    page_obj = paginator.get_page(page_number)
    serializer = MyModelSerializer(page_obj)
    return render(request, 'my_template.html', {'data': serializer.data})           

在這個例子中,我們首先從資料庫中擷取了一個資料集 MyModel。然後我們從請求中擷取了分頁器參數,并使用它們來建立一個分頁器對象。接下來,我們擷取了目前頁面的編号,并使用它來擷取對應的資料對象。最後,我們将資料對象序列化為 JSON 格式,并将其傳遞給模闆進行渲染。

樣例代碼:

from django.db import models
from django.core.paginator import Paginator
from rest_framework import generics
from myapp.serializers import MyModelSerializer
from myapp.models import MyModel

class MyModelList(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = PaginationSerializerMethodField # 自定義分頁字段類
    serializer_context = {'request': Request.request} # 将請求對象傳遞給序列化器
    pagination_class_defaults = {'per_page': 10} # 每個頁面顯示的資料量預設為 10 條記錄
    serializer_class_defaults = {'fields': '__all__'}
# 所有字段都需要進行序列化,預設為所有字段都進行序列化
    pagination_serializer_class = PaginationSerializer 
#自定義分頁序列化器類,繼承自 Django Rest Framework 内置的 PaginationSerializer 類
    pagination_serializer_class_defaults = {'fields': ('count', 'per_page', 'current_page', 'total_pages')} 
#自定義分頁序列化器預設包含 count、per_page、current_page、total_pages 這些字段           
Django開源架構2023-6-10(分頁器)
Django開源架構2023-6-10(分頁器)
Django開源架構2023-6-10(分頁器)

-----更多說明-----

除了自定義分頁器字段和序列化器外,您還可以使用 Django Rest Framework 中的其他功能來處理分頁器請求。例如,您可以使用 RequestParser 類來解析查詢字元串參數,并使用 QuerySetPaginator 類來将查詢集轉換為分頁器對象。

此外,您還可以使用 Django Rest Framework 的内置分頁器過濾器(PaginationFilter)來處理分頁器請求。該過濾器允許您根據 HTTP 請求頭中的分頁資訊來過濾查詢集。例如,如果您希望隻傳回特定頁面或特定頁面大小的資料,您可以使用 PaginationFilter 來實作這一點。

以下是一個示例代碼片段,示範如何使用 RequestParser 和 QuerySetPaginator 類來處理分頁器請求:

from django.core.paginator import Paginator
from rest_framework import generics
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer
from rest_framework.pagination import PageNumberPagination

class MyModelList(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = PageNumberPagination 
# 自定義分頁類,繼承自 Django Rest Framework 内置的 PageNumberPagination 類
    serializer_context = {'request': Request.request}
# 将請求對象傳遞給序列化器
    pagination_class_defaults = {'per_page': 10}
# 每個頁面顯示的資料量預設為 10 條記錄
    serializer_class_defaults = {'fields': '__all__'} 
# 所有字段都需要進行序列化,預設為所有字段都進行序列化
    pagination_serializer_class = MyModelSerializer 
#自定義分頁序列化器類,繼承自 MyModelSerializer 類
    pagination_serializer_class_defaults = {'fields': ('count', 'per_page', 'current_page', 'total_pages')} 
#自定義分頁序列化器預設包含 count、per_page、current_page、total_pages 這些字段
    
    def get_queryset(self):
        parser = RequestParser(self.request) # 建立一個 RequestParser 執行個體
        parser.parse(self.request) # 解析查詢字元串參數
        queryset = self.queryset.filter(some_field=parser.get('some_field'), some_other_field=parser.get('some_other_field')) 
# 根據查詢字元串參數過濾查詢集
        return queryset # 傳回過濾後的查詢集
    
class MyModelDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = PageNumberPagination 
# 自定義分頁類,繼承自 Django Rest Framework 内置的 PageNumberPagination 類
    serializer_context = {'request': Request.request} 
# 将請求對象傳遞給序列化器
    pagination_class_defaults = {'per_page': 10} 
# 每個頁面顯示的資料量預設為 10 條記錄
    serializer_class_defaults = {'fields': '__all__'} 
# 所有字段都需要進行序列化,預設為所有字段都進行序列化
    pagination_serializer_class = MyModelSerializer
#自定義分頁序列化器類,繼承自 MyModelSerializer 類
    pagination_serializer_class_defaults = {'fields': ('count', 'per_page', 'current_page', 'total_pages')} 
#自定義分頁序列化器預設包含 count、per           
Django開源架構2023-6-10(分頁器)
Django開源架構2023-6-10(分頁器)
Django開源架構2023-6-10(分頁器)