对 Django Rest Framework 中的 ViewSet 返回的列表进行分页

Osk*_*son 1 python django pagination django-rest-framework

我创建了一个ViewSet带有重写list方法的类,如下所示:

from rest_framework.response import Response
from rest_framework import viewsets

class MyViewSet(views.ViewSet):

    def list(self, request):
        return Response([
            {"id": 1},
            {"id": 2},
        ])
Run Code Online (Sandbox Code Playgroud)

如何对该回复进行分页?

我有settings.py以下设置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'LinkHeaderPagination',
    'PAGE_SIZE': 10
}
Run Code Online (Sandbox Code Playgroud)

并且LinkHeaderPagination是这样构建的:

from rest_framework import pagination
from rest_framework.response import Response

class LinkHeaderPagination(pagination.PageNumberPagination):
    page_size_query_param = 'page_size'

    def get_paginated_response(self, data):
        next_url = self.get_next_link()
        previous_url = self.get_previous_link()

        if next_url is not None and previous_url is not None:
            link = '<{next_url}>; rel="next", <{previous_url}>; rel="prev"'
        elif next_url is not None:
            link = '<{next_url}>; rel="next"'
        elif previous_url is not None:
            link = '<{previous_url}>; rel="prev"'
        else:
            link = ''

        link = link.format(next_url=next_url, previous_url=previous_url)
        headers = {'Link': link, 'Count': self.page.paginator.count} if link else {}

        return Response(data, headers=headers)
Run Code Online (Sandbox Code Playgroud)

这非常有用,ModelViewSets因为它们有指定的查询集,但如何对列表进行分页?

Sar*_*iev 5

您只需要调用get_paginated_reponse分页器上的方法而不是返回Response。如果这只是单个视图集

class MyViewSet(views.ViewSet):
    def list(self, request):
        data = [
            {"id": 1},
            {"id": 2},
        ]
        paginator = LinkHeaderPagination()
        page = paginator.paginate_queryset(data, request)
        if page is not None:
            return paginator.get_paginated_response(page)

        return Response(data)
Run Code Online (Sandbox Code Playgroud)