Skip to main content
 首页 » 编程设计

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

2025年05月04日25zhenyulu

我有一个 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' object has no attribute 'paginate_queryset'

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

请您参考如下方法:

Pagination is only performed automatically if you're using the generic views or viewsets

阅读docs

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

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

  1. APIView : 这提供了一些处理程序方法,来处理 http 动词:get、post、put、patch 和删除。
  2. ViewSet : 这是对 APIView 的抽象,它提供 actions 作为方法:

    • 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等,当然你也可以挑一些,read the docs .