可以通过继承pagination.BasePagination来自定义分页器,并通过查询参数来动态传递分页参数。下面是一个使用自定义分页器进行动态传参分页的例子:
from rest_framework import pagination
class DynamicPagination(pagination.BasePagination):
def paginate_queryset(self, queryset, request, view=None):
# 获取查询参数中的分页参数
self.page_size = request.query_params.get('page_size', self.page_size)
self.page = request.query_params.get('page', self.page)
# 进行分页处理
start = (int(self.page) - 1) * int(self.page_size)
end = start + int(self.page_size)
return queryset[start:end]
def get_paginated_response(self, data):
# 构建自定义响应格式
return {
'count': self.page.paginator.count,
'next': self.get_next_link(),
'previous': self.get_previous_link(),
'results': data
}
在这个例子中,我们自定义了一个名为DynamicPagination的分页器,它可以动态接收查询参数page_size和page,根据这两个参数来进行分页处理。
在视图类中指定使用该分页器:
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
pagination_class = DynamicPagination
在这个例子中,我们在视图类中指定了使用DynamicPagination作为分页器,因此可以通过查询参数page_size和page来动态传递分页参数。
例如,你可以通过以下请求获取第2页,每页显示3条数据:
http://example.com/my-models/?page=2&page_size=3
在这个请求中,我们通过查询参数page和page_size来动态传递分页参数,DynamicPagination会根据这两个参数来进行分页处理。