如何从django rest框架的基于函数的视图中分页响应?

时间:2015-12-02 12:58:20

标签: django pagination django-rest-framework

我已经编写了如下代码片段,我需要在此实现分页,请让我知道它是如何可能的。另外由于某些原因,我只想使用基于功能的视图。

@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)

3 个答案:

答案 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)

接受的答案有一个BUG

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)

这修复了错误,但将完整的查询集传递给序列化程序将花费大量时间进行序列化,因为序列化程序采用惰性方法,但此性能问题本身就是一个新问题。