欢迎访问我的博客专题
源码可访问 Github 查看
ViewSets & Routers显示商品列表
ViewSet
类几乎与视图类相同,只是它们提供了诸如read
或update
之类的操作,而不是诸如get
或put
之类的方法处理程序。
ViewSet
类只在最后时刻绑定到一组方法处理程序,当它被实例化为一组视图时,通常通过使用一个Router
类来处理为您定义URL conf的复杂性。
使用ViewSets
去除GoodsListView(generics.ListAPIView)
,使用ViewSet
来替换该功能
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
显示商品列表
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
默认情况下GenericViewSet
类不提供任何操作,但是包含了基本的通用视图行为集,例如get_object
和 get_queryset
方法。
也就是之前继承的viewsets.GenericViewSet
没有定义get、post方法,所以还需要使用之前的mixin
处理程序方法只在定义URLConf时绑定到操作。为了了解底层发生了什么,首先显式地从viewset
创建一组视图。
在主 urls.py 中将ViewSet类绑定到一组具体的视图中。
from goods.views import GoodsListView, GoodsListViewSet
goods_list = GoodsListViewSet.as_view({
'get': 'list',
})
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls')), # drf 认证url
path('ckeditor/', include('ckeditor_uploader.urls')), # 配置富文本编辑器url
path('goods/', goods_list, name='goods_list'),
# DRF文档
path('docs/', include_docs_urls(title='DRF文档')),
]
请注意我们如何通过将http方法绑定到每个视图所需的操作来从每个ViewSet类创建多个视图。上面的get
方法绑定到ListModelMixin(object)
中的list
操作。
现在已经将资源绑定到具体的视图中,可以像往常一样用URL conf注册视图goods_list
。
刷新 http://127.0.0.1:8000/goods/ 也会返回相同的内容

使用Routers
因为使用的是ViewSet
类而不是View
类,所以实际上不需要自己设计URL。 可以使用Router
类自动处理将资源连接到视图和URL的约定。 需要做的就是用路由器注册适当的视图集,然后让它完成剩下的工作。
from rest_framework.routers import DefaultRouter
from goods.views import GoodsListView, GoodsListViewSet
# 创建一个路由器并注册我们的视图集
router = DefaultRouter()
router.register(r'goods', GoodsListViewSet) # 配置goods的url
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls')), # drf 认证url
path('ckeditor/', include('ckeditor_uploader.urls')), # 配置富文本编辑器url
path('', include(router.urls)), # API url现在由路由器自动确定。
# DRF文档
path('docs/', include_docs_urls(title='DRF文档')),
]
向路由器注册视图集与提供urlpattern类似。 包括两个参数 - 视图的URL前缀和视图集本身。
正在使用的DefaultRouter
类也会自动创建API根视图。
访问 http://127.0.0.1:8000/goods/ ,可以看到Api Root


继承关系
mixins
- mixins
-
CreateModelMixin
:创建一个模型实例。POST
-
ListModelMixin
:列出查询集。GET
-
RetrieveModelMixin
:检索模型实例。GET
-
UpdateModelMixin
:更新一个模型实例。UPDATE
-
DestroyModelMixin
:销毁一个模型实例。DELETE
-
viewsets
视图集本质上只是一种基于类的视图,它不提供任何方法处理程序,如get()
、 post()
等…而是有一些操作,如list()
、retrieve()
、create()
等……
操作仅在实例化视图时绑定到方法。
user_list = UserViewSet.as_view({'get': 'list'})
user_detail = UserViewSet.as_view({'get': 'retrieve'})
通常,不直接从viewset实例化视图,而是用router注册viewset,并自动确定URL conf。
router = DefaultRouter()
router.register(r'users', UserViewSet, 'user')
urlpatterns = router.urls
- viewsets
-
ViewSetMixin:重写
.as_view()
,使其接受执行的actions
关键字;将HTTP方法绑定到资源上的操作。例如,要创建一个绑定GET
和POST
方法的具体视图到list
和create
操作…view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
-
ViewSet(ViewSetMixin, views.APIView):默认情况下,基本
ViewSet
类不提供任何操作。 -
GenericViewSet(ViewSetMixin, generics.GenericAPIView):默认情况下
GenericViewSet
类不提供任何操作,但是包含了基本的通用视图行为集,例如get_object
和get_queryset
方法。 -
ReadOnlyModelViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, GenericViewSet):提供默认的
list()
和retrieve()
操作的viewset。 -
ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet):提供默认值的
create()
,retrieve()
,update()
,partial_update()
的视图集,destroy()
andlist()
操作。
-
ViewSetMixin:重写
generics
还未写
网友评论