Django Rest Framework是一个开源的库,用于为Django创建API,它提供了许多有用的扩展和工具,其中之一是分页。通过使用分页,我们可以限制返回的结果数量。Django Rest Framework提供了三种分页方式,包括:
-
PageNumberPagination:用传统的分页方式来分页结果。这个分页器非常简单,仅需提供每页的数据数量即可。
-
LimitOffsetPagination:它在分页结果时,使用起始位置和限制数量。它在获取大批量数据时表现更好。
-
CursorPagination:以游标的方式来分页结果。这个分页器更适合在类似Twitter的应用程序中使用。
下面我们将详细讲解这三种分页方式,以及它们的使用:
1. PageNumberPagination
PageNumberPagination是DRF默认的分页方式,这种分页器使用了传统的分页方式,每个页面包含一定数量的元素。 它需要定义page_size属性,指定每个页面的元素个数。
首先,我们需要在Django Rest Framework中启用分页。我们可以在settings.py文件中的REST_FRAMEWORK中添加以下代码:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 3
}
这会启用PageNumberPagination,并在每个页面中设置3个元素。
接下来,在视图中实现分页,需要在视图中实例化分页器,对查询集进行分页,最后将分页结果返回给前端。
from rest_framework.pagination import PageNumberPagination
class EmployeeAPIView(APIView):
def get(self, request, format=None):
paginator = PageNumberPagination()
paginator.page_size = 3
queryset = Employee.objects.all()
result_page = paginator.paginate_queryset(queryset, request)
serializer = EmployeeSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
在上面的示例中,我们使用GET请求,来获取Employee模型的分页结果。我们先实例化一个分页器(PageNumberPagination)并设置页面大小为3。接着,我们从数据库中获取Employee对象,并将结果集传递给paginator.paginate_queryset()方法进行分页,这个方法会返回分页后的结果返回给queryset变量。在这里,我们使用EmployeeSerializer将分页结果序列化,最后将序列化结果作为数据返回。
2. LimitOffsetPagination
LimitOffsetPagination使用一种基于位置的分页方式,而不是基于页码的分页方式。它需要定义字典offset_query_param和limit_query_param属性,分别表示偏移量和每次返回的数据数量。
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 3, # just for the example
'DEFAULT_LIMIT': 2, # just for the example
'MAX_LIMIT': 5 # just for the example
}
在视图中,实例化分页器并对查询集分页。这里,我们要对查询集增加self.request.query_params.get('limit')和self.request.query_params.get('offset')变量,然后使用limit来表示每页显示的数据数量,使用offset来表示偏移量。
from rest_framework.pagination import LimitOffsetPagination
class EmployeeAPIView(APIView):
def get(self, request, format=None):
paginator = LimitOffsetPagination()
queryset = Employee.objects.all()
limit = self.request.query_params.get('limit', 2)
offset = self.request.query_params.get('offset', 0)
paginator.default_limit = 2
paginator.max_limit = 5
paginator.limit_query_param = 'limit'
paginator.offset_query_param = 'offset'
result_page = paginator.paginate_queryset(queryset, request, view=self)
serializer = EmployeeSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
上面的代码片段演示了如何使用LimitOffsetPagination来分页Employee模型。 我们先将它作为DEFAULT_PAGINATION_CLASS的值,然后在视图中实例化查询集,使用分页器进行分页,并将结果序列化返回。
在上面的代码中,我们还设置了变量limit和offset。这些变量对应的是请求的URL参数中的limit和offset。我们还设置了分页器的默认限制、最大限制和offse和limit属性。最后,我们使用limit和offset变量,通过URL来传递给查询集进行分页。
3. CursorPagination
CursorPagination是Django Rest Framework中的第三种分页方式,是基于游标来实现分页的。它可以避免在数据库中分页时的性能问题。
和前面两种分页方式一样,我们需要在settings.py文件中启用分页器,然后在视图中实现分页。
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
'PAGE_SIZE': 3,
'ORDERING': 'id'
}
需要注意ORDERING这个字段,我们可以在这里设置按照哪个字段进行排序。
下面是一个演示如何使用CursorPagination分页的示例。
from rest_framework.pagination import CursorPagination
from rest_framework.response import Response
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
class MyCursorPagination(CursorPagination):
page_size_query_param = 'page_size'
max_page_size = 100
ordering = '-id'
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def get_data(request):
queryset = MyModel.objects.all()
pagination = MyCursorPagination()
page = pagination.paginate_queryset(queryset=queryset, request=request)
serializer = MyModelSerializer(page, many=True)
response = pagination.get_paginated_response(serializer.data)
return response
首先,我们定义了一个定制化的分页器类(MyCursorPagination),它继承了CursorPagination类。 我们指定了要按照id进行排序,以及指定了每页显示的数据量和最大页码数。
在我们的视图函数中,我们首先获取MyModel中的所有对象,然后将它的查询集传递给分页器。接着,我们在分页器中使用自定义分页器类(MyCursorPagination),将查询集进行分页,然后序列化结果返回给前端。
以上就是“Django Rest framework三种分页方式详解”的完整攻略,其中包括PageNumberPagination、LimitOffsetPagination和CursorPagination这三种分页方式的详细介绍和示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Rest framework三种分页方式详解 - Python技术站