欢迎访问宙启技术站
智能推送

使用Python中的rest_framework.paginationBasePagination()实现后端数据分页及筛选功能

发布时间:2023-12-16 07:20:23

在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方法将分页后的结果返回给前端。前端可以通过传递分页和筛选参数来请求特定页数和筛选结果。