我已经编写了如下代码片段,我需要在此实现分页,请让我知道它是如何可能的。另外由于某些原因,我只想使用基于功能的视图。
@api_view(['GET',])
@permission_classes([AllowAny,])
def PersonView(request):
context={'request': request}
person_objects = Person.objects.all()
if len(person_objects)> 0:
person_data = PersonSerializer(person_objects,many=True,context=context)
return Response(person_data.data,status=status.HTTP_200_OK)
else:
return Response({},status=status.HTTP_200_OK)
答案 0 :(得分:17)
http://www.django-rest-framework.org/api-guide/pagination/
from rest_framework.pagination import PageNumberPagination
@api_view(['GET',])
@permission_classes([AllowAny,])
def PersonView(request):
paginator = PageNumberPagination()
paginator.page_size = 10
person_objects = Person.objects.all()
result_page = paginator.paginate_queryset(person_objects, request)
serializer = PersonSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
答案 1 :(得分:1)
您还可以通过覆盖PageNumberPagination
来定义自定义分页类pagination.py
./run_indexer.sh
它将有助于定义
page_size,页面查询自定义参数和max_page_size
views.py
from rest_framework import pagination
class StandardResultsSetPagination(pagination.PageNumberPagination):
page_size = 10
page_query_param = 'page'
page_size_query_param = 'per_page'
max_page_size = 1000
<强>例如强> 请求强>
from rest_api.pagination import StandardResultsSetPagination
@api_view(['GET',])
@permission_classes([AllowAny,])
def PersonView(request):
person_objects = Person.objects.all()
if len(person_objects)> 0:
paginator = StandardResultsSetPagination()
result_page = paginator.paginate_queryset(person_objects, request)
serializer = PersonSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
else:
return Response({},status=status.HTTP_200_OK)
<强>响应强>
GET https://api.example.org/persons/?page=1&per_page=10
答案 2 :(得分:0)
ModelSerializer 接受一个查询集或一个对象,在接受的答案中,PersonSerializer
被赋予 paginator.paginate_queryset
的输出,它返回一个 list 包含类 Page 的单个元素因此序列化程序将返回不完整的数据或根本没有数据(知道这一点,因为已经尝试并看到了错误的结果)。
这可以通过将实际查询集传递给序列化程序来轻松解决,在本例中为 person_objects
,
所以最终的代码是,
from rest_framework.pagination import PageNumberPagination
@api_view(['GET',])
@permission_classes([AllowAny,])
def PersonView(request):
paginator = PageNumberPagination()
paginator.page_size = 10
person_objects = Person.objects.all()
result_page = paginator.paginate_queryset(person_objects, request)
serializer = PersonSerializer(person_objects, many=True) # MAIN CHANGE IS HERE
return paginator.get_paginated_response(serializer.data)
这修复了错误,但将完整的查询集传递给序列化程序将花费大量时间进行序列化,因为序列化程序采用惰性方法,但此性能问题本身就是一个新问题。