REST framework 包含對可定製分頁樣式的支援。這使你可以將較大的結果集分成單獨的資料頁面。

分頁 API 支援:

  • 以分頁連結的形式作為響應內容的一部分。
  • 以分頁連結的形式包含在響應的 header 中,如 Content-Range 或 Link.

    內建的樣式目前是以分頁連結的形式作為響應內容的一部分。使用可瀏覽的 API 時,此樣式更易於訪問。

分頁僅在你使用通用檢視或檢視集時自動執行。如果你使用的是常規 APIView,則需要自己呼叫分頁 API 以確保返回分頁響應。示例請參閱 mixins.ListModelMixin 和 generics.GenericAPIView 類的原始碼。

可以通過將分頁類設定為 None,關閉分頁。

設定分頁樣式

分頁樣式可以使用 DEFAULT_PAGINATION_CLASS 和 PAGE_SIZE setting key 全域性設定。例如,要使用內建的 page_size/page 分頁,你可以這樣做:

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}

繼承viewsets.GenericViewSet,設定pagination_class屬性即可。

自定義分頁樣式:

要建立自定義分頁序列化類,你應該繼承 pagination.BasePagination 並覆蓋 paginate_queryset(self, queryset, request, view=None) 和 get_paginated_response(self, data) 方法:

  • paginate_queryset 方法被傳遞給初始查詢集,並且應該返回一個只包含請求頁面中的資料的可迭代物件。
  • get_paginated_response 方法傳遞序列化的頁面資料,並返回一個 Response 例項。

    請注意,paginate_queryset 方法可以在分頁例項上設定狀態,而後 get_paginated_response 方法可以使用它。

我們可以基於APIView自行實現分頁。

# app/views.py
class DemoAPIView(APIView):
def get(self, request, *args, **kwargs):
from task.models import Task
from task.serializers import TaskSerializer
queryset = Task.objects.all().order_by("id")
pg = PageNumberPagination()
pg_queryset = pg.paginate_queryset(queryset=queryset,request=request,view=self)
serializer = TaskSerializer(pg_queryset,many=True) # serializer.is_valid(raise_exception=True)
# data = serializer.validated_data
# return Response(data=serializer.data)
return pg.get_paginated_response(serializer.data)