首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django Rest Framework使用PageNumberPagination类添加页码属性

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

Stack Overflow用户
提问于 2017-10-08 02:27:49
回答 5查看 4.6K关注 0票数 5

我正在使用Django和Django rest框架构建一个API,并尝试在json结果上添加页码。我正在尝试在返回的结果中添加页码,例如,我现在得到了这个;

代码语言:javascript
运行
AI代码解释
复制
{
  "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"
    }
  ]
}

但是我正在试着得到这样的东西;

代码语言:javascript
运行
AI代码解释
复制
{
  "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...从父类获取它,除了使用函数之外,我看不到任何直接的方法。这是我的代码;

代码语言:javascript
运行
AI代码解释
复制
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...,
        })
EN

回答 5

Stack Overflow用户

发布于 2017-10-08 02:58:41

您可以在视图集中使用自定义分页,也可以在自定义视图上进行更改

pagination.py

代码语言:javascript
运行
AI代码解释
复制
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)
         ]))

在您的视图中

代码语言:javascript
运行
AI代码解释
复制
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) 

代码语言:javascript
运行
AI代码解释
复制
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'my_project.apps.core.pagination.CustomPageNumber',
    'PAGE_SIZE': 100
}

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

票数 12
EN

Stack Overflow用户

发布于 2017-10-09 04:09:43

如果我没记错的话,你可以用self.page.number

代码语言:javascript
运行
AI代码解释
复制
    return Response({
        'links': {
            'next': self.get_next_link(),
            'previous': self.get_previous_link()
        },
        'count': self.page.paginator.count,
        'results': data,
        'page_number': self.page.number,
        #              ^^^^^^^^^^^^^^^^
    })
票数 4
EN

Stack Overflow用户

发布于 2021-03-31 09:35:30

我认为像这样获得tofrom可能更适用:

代码语言:javascript
运行
AI代码解释
复制
class MyCustomPagination(pagination.PageNumberPagination):

    def get_from(self):
        return int((self.page.paginator.per_page * self.page.number) - self.page.paginator.per_page + 1)

    def get_to(self):
        return self.get_from() + int(len(self.page.object_list)) - 1

    def get_paginated_response(self, data):

        return Response({
            'next': self.get_next_link(),
            'previous': self.get_previous_link(),
            'count': self.page.paginator.count,
            'total_pages': self.page.paginator.num_pages,
            'page_number': self.page.number,
            'per_page': self.page.paginator.per_page,
            'from': self.get_from(),
            'to': self.get_to(),
            'results': data
        })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46626994

复制
相关文章
Django REST Framework-如何使用分页
在 Web 开发中,处理大量数据是非常常见的。但是,如果一次性返回所有数据,不仅会增加服务器的负担,而且还会影响客户端的响应时间。为了解决这个问题,分页被广泛应用于 Web 应用程序中,特别是在 RESTful API 中。
玖叁叁
2023/04/25
2.1K1
第 6 篇:分页接口
如果没有设置分页,django-rest-framework 会将所有资源类表序列化后返回,如果资源很多,就会对网站性能造成影响。为此,我们来给博客文章列表 API 添加分页功能。
HelloGitHub
2021/05/14
6700
Django REST framework初次使用
我们将使用 django-rest 创建一个简单的API,以允许管理员用户查看和编辑系统中的user和group。
用户4945346
2020/06/16
7360
python测试开发django-rest-framework-86.分页查询功能(PageNumberPagination)
当查询出来的数据量非常大的时候,需要分页查询,django-rest-framework 提供了分页的支持。 有三种分页功能:PageNumberPagination,LimitOffsetPagination,CursorPagination。
上海-悠悠
2021/02/03
1.2K0
Django REST Framework-类视图(三)
ModelViewSet是一个基于视图集的通用类,提供了处理CRUD操作的通用功能。它继承自GenericAPIView和ViewSetMixin,提供了以下方法:
玖叁叁
2023/04/24
3100
Django REST Framework-类视图(二)
除了APIView类之外,DRF还提供了许多其他的类视图,以便我们更方便地编写代码和扩展API。以下是其中的一些:
玖叁叁
2023/04/24
2920
Django REST Framework-类视图(一)
Django REST Framework提供了许多内置的视图来处理不同类型的请求。其中一种是类视图,类视图是一个基于类的视图,可以继承DRF的APIView类或其子类。类视图提供了更多的灵活性和可重用性,可以更容易地组织代码和扩展API。
玖叁叁
2023/04/24
3180
Django REST Framework
Django REST Framework 1. REST 前后端分离 API-ApplicationProgrammingInterface 为了应付千变万化的前端需求 REST:RepresataionsStateTrans 20000 Fieding博士提出 RESTful:遵守REST规范的技术设计的软件可以称为RESTful REST规范 URL代表一个资源,一个资源应该是一个名词 动作有HTTP的methode方法提供 URL应该包含版本信息,版本信息也可以放在HTTP协议中 过滤信息,使用UR
ruochen
2021/07/22
2.2K0
Django REST Framework
Django Rest Framework
https://q1mi.github.io/Django-REST-framework-documentation/
vanguard
2020/07/07
2.3K0
Django REST framework+Vue 打造生鲜超市(五) 六、商品类别数据展示
六、商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级   一种是某一类的分类以及商品详细信息:  开始写商品分类的接口 (2)序列化 给分类添加三
zhang_derek
2018/04/13
2.4K0
Django REST framework+Vue 打造生鲜超市(五)
		六、商品类别数据展示
六、商品类别数据展示
 接口相关代码都放在src/api/api.js里面,调试接口的时候我们首先需要新建一个自己的host,然后替换要调试的host
90后小陈老师
2018/10/01
1.6K0
drf分页器
也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。例如:
仙人技术
2020/07/14
8311
django rest_framework使用jwt
jwt 不是 rest_framework自带的认证方式,需要通过第三方库djangorestframework-jwt结合使用
编程黑洞
2023/03/06
4860
django rest_framework使用jwt
Django REST Framework-分页(一)
在 Web 应用程序中,当我们从数据库中检索大量数据时,为了避免一次性返回所有数据,通常需要将数据分成多个页面。这就是分页的基本概念:将数据分成多个页面,每个页面包含一定数量的数据。
玖叁叁
2023/04/25
2980
8.寻光集后台管理系统-用户管理(增删改查)
在完成了登录和注册视图之后,需求中还需要管理员可以管理用户列表,所以就需要完成基础的增删改查操作
zx钟
2022/12/02
1.9K0
8.寻光集后台管理系统-用户管理(增删改查)
Django REST Framework-常用的类视图
Django REST Framework是基于Django的一个用于构建Web API的框架。它提供了许多用于构建Web API的工具和实用程序,其中最常用的是类视图。类视图是一种Django REST Framework的API视图,它是基于类的视图。它提供了一种方便的方式来编写可重用的Web API视图,并带有许多有用的内置功能。
玖叁叁
2023/04/24
7180
DRF框架学习(四)
重写 get_serializer_class和get_queryset,根据不同的操作返回不同的序列化器类和不同的查询集。
小闫同学啊
2019/07/18
2.8K0
Django REST framework初识
现在工作中用的就是 django-rest 框架,今天主要讲下 django-rest 是个什么东西,为什么会使用它。准确的说 django-rest 是 django web 框架的一个插件,透过Django REST framework( DRF ) 建立 REST API 非常方便快速。现在的常见的开发的模式是前后端分离模式,页面是由前端工程师使用vue、 react等前端框架编写,接口由后端工程师通过其他框架编写,简单来说,前端工程师负责页面渲染,后端工程师负责接口,为前端页面提供数据。这样前后端都由各自擅长的工程师负责,不像很早之前,前后端由一个人编写。这样做的好处是各司其职,专业的人做专业的事。开发效率也很高效,因为django开发速度比较快,如果写api接口的话用django-rest和django很搭。
用户4945346
2020/06/16
6280
点击加载更多

相似问题

Django rest如何使用PageNumberPagination分页

19

Django Rest 'PageNumberPagination‘对象没有属性’页面‘错误

34

如果页码超出范围,Django PageNumberPagination自定义错误

20

如何在Django Rest框架中使用LimitOffSetPagination而不是PageNumberPagination?

11

以Django Rest Framework / JSON格式向关系添加属性

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档