Django rest fram中ViewSet与GenericViewSet的区别

2024-10-01 17:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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)

它的工作原理是期待。但是,如果我尝试对普通视图集进行相同的操作,如下所示:

^{pr2}$

我得到一个错误说明:

'PolicyViewSet' object has no attribute 'paginate_queryset'

如何使用普通的视图集设置分页。通用视图集和DRF中的视图集有什么区别?在


Tags: djangopyself框架restsettingspageframework
3条回答

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

阅读docs

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

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

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

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

只需从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)

How do i set up pagination with a normal Viewset?

如果您想在视图集中使用“pagination_class”,那么应该使用GenericViewSet而不是viewset。在

相关问题 更多 >

    热门问题