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)