python - Django Rest Framework 使用 PageNumberPagination 类添加页码属性

标签 python json django django-rest-framework

我正在使用 Django 和 Django rest 框架构建 API,我正在尝试在 json 结果中添加页码。我正在尝试在返回的结果中添加页码,例如,我目前正在获取此信息;

{
  "links": {
    "next": null,
    "previous": null
  },
  "count": 1,
  "results": [
    {
      "url": "http://127.0.0.1:8000/api/brands/1/?format=json",
      "name": "microsoft",
      "description": "Nothing",
      "top_brand": true,
      "guid": "microsoft"
    }
  ]
}

但我正试图得到这样的东西;

{
  "count": 1,
  "results": [
    {
      "url": "http://127.0.0.1:8000/api/brands/1/?format=json",
      "name": "microsoft",
      "description": "Nothing",
      "top_brand": true,
      "guid": "microsoft"
    },
    ...
  ],
  "page_number": 1,
  "from": 1,
  "to": 10,
  "last_page": 4
}

最重要的属性是 page_number,但我不太确定如何使用 self... 从父类中获取它,除了使用函数外,我看不到任何直接的方法。这是我的代码;

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

    def get_paginated_response(self, data):
        return Response({
            'links': {
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            },
            'count': self.page.paginator.count,
            'results': data,
            'page_number': self.page.paginator...,
        })

最佳答案

您可以在 View 集中使用自定义分页并在自定义 View 上更改

分页.py

class CustomPageNumber(pagination.PageNumberPagination):
    page_size = 2

    def get_paginated_response(self, data):
        return Response(OrderedDict([
             ('lastPage', self.page.paginator.count),
             ('countItemsOnPage', self.page_size),
             ('current', self.page.number),
             ('next', self.get_next_link()),
             ('previous', self.get_previous_link()),
             ('results', data)
         ]))

在你看来

class TestViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Test.objects.all().order_by('-created_at')
    serializer_class = TestSerializer

    @list_route(methods=['get'], url_path='get-records/(?P<pk>[^/]+)')
    def get_record(self, request, pk):
        self.pagination_class = CustomPageNumber
        queryset = self.filter_queryset(self.queryset.filter(course=pk))
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data) 

你需要在你的settings.py中配置

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.CustomPageNumber',
    'PAGE_SIZE': 100
}

如果您想了解更多信息,请参阅文档 custom-pagination-class

关于python - Django Rest Framework 使用 PageNumberPagination 类添加页码属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46626994/

相关文章:

python - Django 时间字段格式

python - 为什么我不能在 django poll 教程第 5 部分的错误修复中使用 now 变量

python - Tkinter gui 不工作 鼠标和键盘模块

python - 你能在 Python 中返回一个 return 语句吗?

Python:默认参数值与全局变量

jquery - 从 youtube 播放列表中获取视频,使用 jQuery、api

javascript - Google Maps JS API + JSON - 多个标记未显示

json - 如何使用 Azure CLI 命令为 Azure Datafactory 创建 SQL 链接服务?

python - .json 扩展文件 + 时间戳 + Pandas + Python

python - 我总是收到在分配之前引用局部变量的错误!我该如何解决?