首页 > 解决方案 > 分页不适用于我的 Django 休息框架项目,我正在使用通用视图

问题描述

我尝试了很多选项,但分页仍然不起作用。我正在使用这样的通用视图和代码:

class ListFood(generics.ListAPIView):

    queryset = Food.objects.all()
    serializer_class = FoodSerializer

    def list(self,request):
        queryset = self.get_queryset()
        serializer = FoodSerializer(queryset, many=True)
        return Response(serializer.data)

在 中settings.py,我写了这个:

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

我试图修改分页样式的特定方面,例如:

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

class ListFood(generics.ListAPIView):

    queryset = Food.objects.all()
    serializer_class = FoodSerializer
    pagination_class = LargeResultsSetPagination

    def list(self,request):
        queryset = self.get_queryset()
        serializer = FoodSerializer(queryset, many=True)
        return Response(serializer.data)

但它仍然没有工作。

urls.py的是:

app_name = "lab"
urlpatterns = [
    re_path('^food/$', ListFood.as_view(), name="listfood"),
    ]

没有错误消息,但是当我请求 URLhttp://127.0.0.1:8000/api/food/?page=1http://127.0.0.1:8000/api/food/?page=2

它仍然没有分页。Django 给了我 2000 条 JSON 数据。

标签: pythondjango-rest-framework

解决方案


原始list实现分页响应:

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)

    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

您的类list使用自定义实现覆盖,这就是它不返回分页响应的原因。只是不要覆盖list.


推荐阅读