随心一记

一二三四五,上山打老鼠


  • 首页

  • 归档

  • 标签
ywcsb

ywcsb

游戏可以不玩,小说不能不看。

153 日志
3 分类
42 标签
RSS
GitHub 知乎 随心一记
Links
  • 随心一记
  • 追梦人物的
  • MSDN

django rest_framwork pagination 自定义返回数据格式

发表于 2021-05-18 | 阅读 899 | 分类于 Python |

在使用Django rest_framework下 需要自定义前端返回数据的格式

比如说 使用PageNumberPagination 时返回的数据在results中 但是前端用的都是data 前端接口数量多的时候就比较麻烦了

在此之前 你应当和我一样 知道了 使用get方式请求def的接口;

同时本文只在自己用的PageNumberPagination 上作修改 其他的分页器 没有测试

其他表述

  • drf 自定义返回数据格式
  • 自定义分页数据格式
  • 自定义分页改
  • 更改默认Pagination返回的results

处理方式

对于前端请求的格式 如果是 url?page=1&limit=10来表示页面的数量 后端默认的是page;通过继承类来完成定义

from rest_framework.pagination import PageNumberPagination


class AdaptPagination(PageNumberPagination):
    page_size = 10  # 每页数目
    page_query_param = 'page'  # 前端发送的页数关键字名,默认为"page"
    page_size_query_param = 'limit'  # 前端发送的每页数目关键字名,默认为None

之后再setting中配置使用的分页器

REST_FRAMEWORK = {
    //.....
    'DEFAULT_PAGINATION_CLASS':  'qincheng.exception.custom_exception_handler',

}

进一步加上返回格式的处理;查看源码复制出get_paginated_response;get_paginated_response_schema 这两个函数到我们自定义的函数里面去 实现自己数据的定义 例如将 results 改成 data

from rest_framework.pagination import PageNumberPagination


class AdaptPagination(PageNumberPagination):
    page_size = 10  # 每页数目
    page_query_param = 'page'  # 前端发送的页数关键字名,默认为"page"
    page_size_query_param = 'limit'  # 前端发送的每页数目关键字名,默认为None

     def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('data', data)
        ]))
    def get_paginated_response_schema(self, schema):
        return {
            'type': 'object',
            'properties': {
                'count': {
                    'type': 'integer',
                    'example': 123,
                },
                'next': {
                    'type': 'string',
                    'nullable': True,
                    'format': 'uri',
                    'example': 'http://api.example.org/accounts/?{page_query_param}=4'.format(
                        page_query_param=self.page_query_param)
                },
                'previous': {
                    'type': 'string',
                    'nullable': True,
                    'format': 'uri',
                    'example': 'http://api.example.org/accounts/?{page_query_param}=2'.format(
                        page_query_param=self.page_query_param)
                },
                'data': schema,
            },
        }
觉得不错,支持一下!
geerniya WeChat Pay

微信打赏

geerniya Alipay

支付宝打赏

# Python # Django
django restframework serializer 增加自定义字段
Django rest_framwork中ApiView实现分页

发表评论

共 0 条评论

    暂无评论
© 2018 - 2022 ywcsb
冀ICP备17022045号-1
Supported by 腾讯云