我有一个 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 的主要系统:
- APIView : 这提供了一些处理程序方法,来处理 http 动词:
get、post、put、patch和删除。 ViewSet : 这是对 APIView 的抽象,它提供 actions 作为方法:
list:只读,返回多个资源(http动词:get)。返回字典列表。retrieve:只读,单一资源(http 动词:get,但需要一个 id)。返回单个字典。create:创建新资源(http 动词:post)update/partial_update:编辑资源(http 动词:put/patch)destroy:删除资源(http 动词:delete)
GenericViewSet : GenericViewSet有很多种,最常见的是
ModelViewSet。它们继承自GenericAPIView并完整实现了所有操作:list、retrieve、destroy,updated等,当然你也可以挑一些,read the docs .
