python - Django rest框架中ViewSet和GenericViewSet的区别
问题描述
我有一个 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' 对象没有属性 'paginate_queryset'
如何使用普通Viewset设置分页。DRF 中的 GenericViewset 和 Viewset 有什么区别?
解决方案
仅当您使用通用视图或视图集时,才会自动执行分页
阅读文档
并回答您的第二个问题 DRF 中的 GenericViewset 和 Viewset 有什么区别
DRF 有两个主要的视图处理系统:
- APIView:这提供了一些处理程序方法来处理 http 动词:
get
、post
、put
、patch
和delete
。 ViewSet:这是对 APIView 的抽象,它以方法的形式提供操作:
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
推荐阅读
- r - 如何在 1 个图中使用 CI 绘制 2 个均线图
- django - Django Model 的值为 NoneType 为什么?
- vue.js - 为什么我的道具没有被动态绑定?
- php - 尽管变量存在于已包含的文件中,但未定义的变量错误
- typescript - 客户端 Typescript 应用程序和 GraphQL 后端的一般工作流程是什么
- sql-server - 在不删除依赖项的情况下增加列中的小数位数
- youtube-api - 当用户不是内容所有者时如何列出频道
- r - 在 Shiny Dashboard 中选择菜单项时显示第二个菜单
- javascript - 使用 Immer 测试 redux reducer
- javascript - ReactJS:什么是“this.setState(defaultDogs);” 在这段代码中是什么意思?