美文网首页
【Vue+DRF生鲜电商】08.ViewSets & Route

【Vue+DRF生鲜电商】08.ViewSets & Route

作者: 吾星喵 | 来源:发表于2019-04-24 17:47 被阅读0次

欢迎访问我的博客专题

源码可访问 Github 查看

ViewSets & Routers显示商品列表

ViewSet类几乎与视图类相同,只是它们提供了诸如readupdate之类的操作,而不是诸如getput之类的方法处理程序。
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_objectget_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/ 也会返回相同的内容

image.png

使用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

image.png image.png

继承关系

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方法绑定到资源上的操作。例如,要创建一个绑定GETPOST方法的具体视图到listcreate操作…view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
    • ViewSet(ViewSetMixin, views.APIView):默认情况下,基本ViewSet类不提供任何操作。
    • GenericViewSet(ViewSetMixin, generics.GenericAPIView):默认情况下GenericViewSet类不提供任何操作,但是包含了基本的通用视图行为集,例如get_objectget_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() and list() 操作。
generics

还未写

相关文章

网友评论

      本文标题:【Vue+DRF生鲜电商】08.ViewSets & Route

      本文链接:https://www.haomeiwen.com/subject/zccngqtx.html