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)