【问题标题】:Paginating a list returned by a ViewSet in Django Rest Framework在 Django Rest Framework 中对 ViewSet 返回的列表进行分页
【发布时间】:2016-11-09 07:48:39
【问题描述】:

我创建了一个 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},
        ])

如何对这个响应进行分页?

settings.py 我有以下设置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'LinkHeaderPagination',
    'PAGE_SIZE': 10
}

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)

这对ModelViewSets 很有效,因为它们有一个指定的查询集,但是我如何对列表进行分页?

【问题讨论】:

    标签: python django pagination django-rest-framework


    【解决方案1】:

    您只需要在分页器上调用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)
    

    【讨论】:

    • @Oskar 添加完整跟踪。这实际上也是一个单独的问题。因为正如你现在看到的,你的分页器被调用了。
    • 使用您的确切代码我收到此错误:“MyViewSet”对象没有属性“get_paginated_response”
    • @Oskar。抱歉忘了这是ViewSet。阅读更新。您可以使用来自GenericAPIView 的部分来概括此解决方案。并创建自己的PaginatableViewSet
    猜你喜欢
    • 2020-08-26
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2014-07-01
    • 2015-03-02
    • 2014-05-29
    相关资源
    最近更新 更多