operations_project/apps/template/pagination.py

37 lines
1.5 KiB
Python
Raw Normal View History

2025-05-20 15:57:10 +08:00
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)