使用Python中的rest_framework.paginationBasePagination()实现后端数据分页及筛选功能
在Python中,可以使用Django框架提供的rest_framework.pagination库来实现后端数据分页和筛选功能。这个库为我们提供了一些分页类,其中最基本的是BasePagination类。
BasePagination类是一个抽象类,不能直接使用,但它定义了一些方法和属性,可用作其他分页类的基类。我们可以通过继承这个类来实现自定义的分页类。
下面是一个使用BasePagination类实现分页和筛选功能的示例:
from rest_framework.pagination import BasePagination
from rest_framework.response import Response
class CustomPagination(BasePagination):
def paginate_queryset(self, queryset, request, view=None):
# 获取请求中的分页参数
page = request.query_params.get('page')
limit = request.query_params.get('limit')
# 可选:对查询结果进行筛选
keyword = request.query_params.get('keyword')
if keyword:
queryset = queryset.filter(name__icontains=keyword)
# 需要传入的参数:总数据量count,每页数据量limit
self.count = queryset.count()
self.limit = int(limit)
# 计算页数
if self.limit == 0:
self.limit = 10
self.num_pages = int(self.count / self.limit)
if self.count % self.limit > 0:
self.num_pages += 1
# 获取当前页数
if page:
self.current_page = int(page) if int(page) in range(1, self.num_pages + 1) else 1
else:
self.current_page = 1
# 返回分页后的查询结果
start = (self.current_page - 1) * self.limit
end = start + self.limit
return queryset[start:end]
def get_paginated_response(self, data):
# 构建返回结果
return Response({
'count': self.count,
'num_pages': self.num_pages,
'current_page': self.current_page,
'results': data
})
在上述示例中,我们创建了一个名为CustomPagination的分页类,继承自BasePagination。在paginate_queryset方法中,我们首先获取请求中的分页和筛选参数,然后根据这些参数对查询结果进行筛选,计算总数据量count和每页数据量limit,然后计算总页数num_pages和当前页数current_page。最后根据当前页数对查询结果进行切片,并返回分页后的结果。
在get_paginated_response方法中,我们构建了返回结果,包括总数据量、总页数、当前页数和查询结果。这个方法将会在视图函数中被调用,将分页后的结果返回给前端。
下面是一个使用CustomPagination的例子:
from django.views import View
from .models import MyModel
from .serializers import MySerializer
class MyView(View):
def get(self, request):
queryset = MyModel.objects.all()
# 创建分页对象
paginator = CustomPagination()
# 获取分页后的查询结果
paginated_queryset = paginator.paginate_queryset(queryset, request)
# 序列化查询结果
serializer = MySerializer(paginated_queryset, many=True)
# 返回分页后的结果
return paginator.get_paginated_response(serializer.data)
在上述例子中,我们创建了一个名为MyView的视图类,在其get方法中,我们首先获取所有的MyModel对象,然后创建CustomPagination的实例。接着使用paginate_queryset方法对查询结果进行分页和筛选,再将分页后的结果进行序列化,最后通过调用get_paginated_response方法返回分页后的结果。
使用上述例子的代码,可以在后端实现分页和筛选功能,并通过调用get方法将分页后的结果返回给前端。前端可以通过传递分页和筛选参数来请求特定页数和筛选结果。
