11

我有一个 Django 休息框架GenericViewset,我正在尝试为其设置分页,如下所示:

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

#views.py
class PolicyViewSet(viewsets.GenericViewSet):
    def list(self, request):
        queryset = Policy.objects.all()
        page = self.paginate_queryset(queryset)
        serializer = PolicySerializer(page, many=True)
        return self.get_paginated_response(serializer.data)

这可以按预期工作。但是,如果我尝试仅对普通Viewset执行相同操作,如下所示:

#views.py
class PolicyViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Policy.objects.all()
        page = self.paginate_queryset(queryset)
        serializer = PolicySerializer(page, many=True)
        return self.get_paginated_response(serializer.data)

我收到一条错误消息:

'PolicyViewSet' 对象没有属性 'paginate_queryset'

如何使用普通Viewset设置分页。DRF 中的 GenericViewset 和 Viewset 有什么区别?

4

3 回答 3

23

仅当您使用通用视图或视图集时,才会自动执行分页

阅读文档

并回答您的第二个问题 DRF 中的 GenericViewset 和 Viewset 有什么区别

DRF 有两个主要的视图处理系统:

  1. APIView:这提供了一些处理程序方法来处理 http 动词:getpostputpatchdelete
  2. ViewSet:这是对 APIView 的抽象,它以方法的形式提供操作

    • list: 只读,返回多个资源(http 动词:)get。返回字典列表。
    • retrieve: 只读,单一资源(http 动词:get,但需要一个 id)。返回单个字典。
    • create: 创建一个新资源 (http 动词: post)
    • update/partial_update:编辑资源(http动词put/patch:)
    • destroy: 删除一个资源(http 动词: delete
  3. GenericViewSet:有很多 GenericViewSet,最常见的是ModelViewSet. 它们继承自GenericAPIView并完整实现了所有操作list、、、、retrieve等。当然,您也可以选择其中的一些,destroy阅读文档updated

于 2019-02-15T04:53:20.150 回答
1

也从 GenericViewSet 继承。例如:

#views.py
class PolicyViewSet(viewsets.ViewSet, viewsets.GenericViewSet):
    def list(self, request):
        queryset = Policy.objects.all()
        page = self.paginate_queryset(queryset)
        serializer = PolicySerializer(page, many=True)
        return self.get_paginated_response(serializer.data)
于 2019-09-17T00:56:40.040 回答
0

如何使用普通 Viewset 设置分页?

如果你想在你的视图中使用“pagination_class”,那么你应该使用GenericViewSet而不是ViewSet

于 2019-05-07T10:37:21.070 回答