我有一个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有什么区别?
答案 0 :(得分:1)
仅当您使用通用时,才会自动执行分页 视图或视图集
阅读docs
并回答第二个问题 DRF中的GenericViewset和Viewset有什么区别
DRF有两个主要的视图处理系统:
get
,post
,put
,patch
和{{1} }。ViewSet:这是对APIView的抽象,它提供了动作作为方法:
delete
:只读,返回多个资源(http动词:list
)。返回字典列表。get
:只读的单个资源(http动词:retrieve
,但需要一个ID)。返回单个字典。get
:创建新资源(http动词:create
)post
:编辑资源(http动词:update/partial_update
)put/patch
:删除资源(http动词:destroy
) GenericViewSet:有许多GenericViewSet,最常见的是delete
。它们继承自ModelViewSet
,并具有所有操作的完整实现:GenericAPIView
,list
,retrieve
,destroy
,等等。当然,您也可以选择其中的一些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 。