您现在的位置是: 网站首页 >Django >Vue+Django REST framework前后端分离生鲜电商 Django

【Vue+DRF生鲜电商】08.ViewSets & Routers显示商品列表

admin2019年4月24日 17:45 Django | Python | Vue 1646人已围观

Vue+Django REST framework前后端分离生鲜电商简介 Vue+Django REST framework 打造前后端分离的生鲜电商项目(慕课网视频)。 Github地址:https://github.com/xyliurui/DjangoOnlineFreshSupermarket ; Django版本:2.2、djangorestframework:3.9.2。 前端Vue模板可以直接联系我拿。

### ViewSets & Routers显示商品列表 `ViewSet`类几乎与视图类相同,只是它们提供了诸`如read`或`update`之类的操作,而不是诸如`get`或`put`之类的方法处理程序。 `ViewSet`类只在最后时刻绑定到一组方法处理程序,当它被实例化为一组视图时,通常通过使用一个`Router`类来处理为您定义URL conf的复杂性。 #### 使用ViewSets 去除`GoodsListView(generics.ListAPIView)`,使用`ViewSet`来替换该功能 ```python 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类**绑定**到一组具体的视图中。 ```python 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/ 也会返回相同的内容 ![BLOG_20190424_174721_89](/media/blog/images/2019/04/BLOG_20190424_174721_89.png "博客图集BLOG_20190424_174721_89.png") #### 使用Routers 因为使用的是`ViewSet`类而不是`View`类,所以实际上不需要自己设计URL。 可以使用`Router`类自动处理将资源连接到视图和URL的约定。 需要做的就是用路由器注册适当的视图集,然后让它完成剩下的工作。 ```python 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 ![BLOG_20190424_174701_21](/media/blog/images/2019/04/BLOG_20190424_174701_21.png "博客图集BLOG_20190424_174701_21.png") ![BLOG_20190424_174654_52](/media/blog/images/2019/04/BLOG_20190424_174654_52.png "博客图集BLOG_20190424_174654_52.png") #### 继承关系 ##### mixins - mixins - `CreateModelMixin`:创建一个模型实例。`POST` - `ListModelMixin`:列出查询集。`GET` - `RetrieveModelMixin`:检索模型实例。`GET` - `UpdateModelMixin`:更新一个模型实例。`UPDATE` - `DestroyModelMixin`:销毁一个模型实例。`DELETE` ##### viewsets 视图集本质上只是一种基于类的视图,它不提供任何方法处理程序,如`get()`、 `post()`等…而是有一些操作,如`list()`、`retrieve()`、`create()`等…… 操作仅在实例化视图时绑定到方法。 ```python user_list = UserViewSet.as_view({'get': 'list'}) user_detail = UserViewSet.as_view({'get': 'retrieve'}) ``` 通常,不直接从viewset实例化视图,而是用router注册viewset,并自动确定URL conf。 ```python 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()` and `list()` 操作。 ##### generics 还未写

很赞哦! (3)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行2285天
  • 系统信息:Linux
  • 后台程序:Python: 3.8.10
  • 网站框架:Django: 3.2.6
  • 文章统计:257 篇
  • 文章评论:63 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 公众号:微信扫描二维码,关注我们
  • QQ群:QQ加群,下载网站的学习源码
返回
顶部
标题 换行 登录
网站