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

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

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

 

在此之前 你应当和我一样 知道了 使用get方式请求def的接口;同时本文只在自己用的PageNumberPagination 上作修改 其他的分页器 没有测试

其他表述

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

处理方式

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

from rest_framework.pagination import PageNumberPagination 
class AdaptPagination(PageNumberPagination):
    page_size = 15# 每页数目
    page_query_param = 'currrent' #前端发送的页数关键字名,默认为"page"
    page_size_query_param = 'pageSize'# 前端发送的每页数目关键字名,默认为None
    max_page_size = 100#前端最多能设置的每页数量

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

REST_FRAMEWORK = {
    //.....
    'DEFAULT_PAGINATION_CLASS':  'Plum.utils.pagination.AdaptPagination',

}

 效果

前端请求

 

后端响应如右

django drf pagination 自定义返回数据格式_第1张图片

 

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

from rest_framework.response import Response
from collections import OrderedDict
class AdaptPagination(PageNumberPagination):
    page_size = 15# 每页数目
    page_query_param = 'currrent' #前端发送的页数关键字名,默认为"page"
    page_size_query_param = 'pageSize'# 前端发送的每页数目关键字名,默认为None
    max_page_size = 100#前端最多能设置的每页数量

    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,
            },
        }

 前后效果对比

django drf pagination 自定义返回数据格式_第2张图片

 

django drf pagination 自定义返回数据格式_第3张图片

参考文章

  • DRF 分页 https://blog.csdn.net/weixin_30693683/article/details/98548170

 

你可能感兴趣的:(全栈,后端,drf,分页,pagenation)