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

Nir*_*yan 4 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)
Run Code Online (Sandbox Code Playgroud)

Geo*_*cob 19

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)
Run Code Online (Sandbox Code Playgroud)


vij*_*jay 6

您还可以通过重写 PageNumberPagination 来定义自定义分页类

\n\n

分页.py

\n\n
from rest_framework import pagination\nclass StandardResultsSetPagination(pagination.PageNumberPagination):\n    page_size = 10\n    page_query_param = \'page\'\n    page_size_query_param = \'per_page\'\n    max_page_size = 1000\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将有助于定义

\n\n
\n

page_size、页面查询自定义参数和max_page_size

\n
\n\n

视图.py

\n\n
from rest_api.pagination import StandardResultsSetPagination\n\n@api_view([\'GET\',])\n@permission_classes([AllowAny,])\ndef PersonView(request):\n    person_objects = Person.objects.all()\n    if len(person_objects)> 0:\n        paginator = StandardResultsSetPagination()\n        result_page = paginator.paginate_queryset(person_objects, request)\n        serializer = PersonSerializer(result_page, many=True)\n        return paginator.get_paginated_response(serializer.data)\n    else:\n        return Response({},status=status.HTTP_200_OK)\n
Run Code Online (Sandbox Code Playgroud)\n\n

例如: \n请求

\n\n
GET https://api.example.org/persons/?page=1&per_page=10\n
Run Code Online (Sandbox Code Playgroud)\n\n

回复

\n\n
HTTP 200 OK\n{\n    "count": 1023\n    "next": "https://api.example.org/persons/?page=2&per_page=10",\n    "previous": null,\n    "results": [\n       \xe2\x80\xa6\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n