37 lines
1.5 KiB
Python
37 lines
1.5 KiB
Python
![]() |
from rest_framework.pagination import PageNumberPagination
|
|||
|
from rest_framework.response import Response
|
|||
|
|
|||
|
class StandardResultsSetPagination(PageNumberPagination):
|
|||
|
"""标准分页器,支持标准响应格式"""
|
|||
|
page_size = 10
|
|||
|
page_size_query_param = 'page_size'
|
|||
|
max_page_size = 100
|
|||
|
|
|||
|
def get_paginated_response(self, data):
|
|||
|
"""
|
|||
|
返回标准格式的分页响应
|
|||
|
|
|||
|
Args:
|
|||
|
data: 已经封装为标准格式的响应数据
|
|||
|
"""
|
|||
|
# 如果data已经是标准格式{code, message, data},则用data['data']取出实际数据
|
|||
|
actual_data = data.get('data') if isinstance(data, dict) and 'data' in data else data
|
|||
|
|
|||
|
# 准备分页元数据
|
|||
|
pagination_data = {
|
|||
|
'count': self.page.paginator.count,
|
|||
|
'next': self.get_next_link(),
|
|||
|
'previous': self.get_previous_link(),
|
|||
|
'results': actual_data,
|
|||
|
'total_pages': self.page.paginator.num_pages,
|
|||
|
'current_page': self.page.number,
|
|||
|
}
|
|||
|
|
|||
|
# 如果data是标准格式,则保持原有message和code,否则使用默认值
|
|||
|
response_data = {
|
|||
|
'code': data.get('code', 200) if isinstance(data, dict) and 'code' in data else 200,
|
|||
|
'message': data.get('message', '获取数据成功') if isinstance(data, dict) and 'message' in data else '获取数据成功',
|
|||
|
'data': pagination_data
|
|||
|
}
|
|||
|
|
|||
|
return Response(response_data)
|