Django rest如何使用PageNumberPagination进行分页

epfja78i  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(107)

我写了以下代码。但是当我转到url posts?page=1时,它仍然显示所有Post模型对象。我该怎么办?
settings.py

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

ursl.py

path('posts', views.posts_view, name='posts_view')

views.py

@api_view(['GET'])
def posts_view(request):
    posts = Post.objects.all()
    serializer = PostSerializer(posts, many=True)
    return Response(serializer.data)
5lhxktic

5lhxktic1#

您正在使用@api_view编写一个基于函数的视图,因此需要手动进行分页。你可以尝试使用provided generic base api views,而不是试图重写它,如果它在你的情况下工作:

class PostView(generics.ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    pagination_class = PageNumberPagination

path('posts', PostView.as_view(), name='posts_view')

要手动分页,你需要像基类一样创建和调用分页:

def my_view(request):
    qs = Post.objects.all()
    pagination = PageNumberPagination()
    page = pagination.paginate_queryset(qs, request)
    serializer = PostSerializer(page, many=True)
    return pagination.get_paginated_response(
        serializer.data
    )

需要明确的是,使用@API_view确实支持使用额外装饰器的其他框架功能,例如@permissions_classes。装饰器不支持分页和过滤等视图级功能。

相关问题