Django rest框架中ViewSet和GenericViewSet之间的区别

时间:2019-02-15 04:47:15

标签: python django django-rest-framework django-rest-viewsets

我有一个Django rest框架 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有什么区别?

3 个答案:

答案 0 :(得分:1)

  

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

阅读docs

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

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

  1. APIView:这提供了一些处理程序方法,用于处理http动词:getpostputpatch和{{1} }。
  2. ViewSet:这是对APIView的抽象,它提供了动作作为方法:

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

答案 1 :(得分: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)

答案 2 :(得分:0)

  

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

如果要在视图集中使用“ pagination_class”,则应使用 GenericViewSet 而不是 ViewSet