辽宁城乡住房建设厅网站打不开,十大互联网平台,四川成都住建局官网,阳江招聘网收银一、视图集和路由器
REST框架包含了一个处理视图集的抽象#xff0c;它允许开发人员集中精力建模API的状态和交互#xff0c;并根据通用约定自动处理URL构造。
视图集类与视图类几乎相同#xff0c;不同之处在于它们提供的是retrieve或update等操作#xff0c;而不是get或…一、视图集和路由器
REST框架包含了一个处理视图集的抽象它允许开发人员集中精力建模API的状态和交互并根据通用约定自动处理URL构造。
视图集类与视图类几乎相同不同之处在于它们提供的是retrieve或update等操作而不是get或put等方法。
一个ViewSet类只在最后一刻被实例化为一组视图时,绑定的一组方法处理程序通常是通过使用一个Router类来处理定义URL conf的繁琐操作。 二、使用视图集重构
让我们获取当前的视图并将它们重构为视图集。 首先让我们将我们的StudentList和StudentDetail视图重构为一个StudentViewSet。我们可以删除这两个视图并用一个类替换它们:
class StudentViewSet(viewsets.ModelViewSet):This viewset automatically provides list, create, retrieve,update and destroy actions.queryset Student.objects.all()serializer_class StudentSerializer
这里我们使用ModelViewSet类自动提供完整的默认读和写操作集。我们仍然设置queryset和serializer_class属性与使用常规视图时完全相同但不再需要向两个单独的类提供相同的信息。 三、显式地将视图集绑定到url 只有当我们定义URLConf时处理程序方法才会绑定到对应的动作上。为了了解内部发生了什么让我们首先从视图集中显式地创建一组视图。在crm/urls.py文件中我们将ViewSet类绑定到一组具体的视图中。
from crm.views import StudentViewSet
from rest_framework import renderersstudent_list StudentViewSet.as_view({get: list,post: create
})
student_detail StudentViewSet.as_view({get: retrieve,put: update,patch: partial_update,delete: destroy
})
注意我们是如何从每个ViewSet类创建多个视图的并为每个视图绑定所需要的http方法。 现在我们已经将资源绑定到具体的视图中我们可以像往常一样用URL conf注册视图。
urlpatterns format_suffix_patterns([path(students/, project_list, namestudent-list),path(students/int:pk/, project_detail, namestudent-detail),
]) 四、使用Routers
因为我们使用的是ViewSet类而不是View类我们实际上不需要自己设计URL conf。使用路由器类可以自动处理将资源连接到视图和绑定url。我们所需要做的就是注册合适的视图集给路由器然后让它完成剩下的工作。 这是我们重新连接的crm/urls.py文件。
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from projects import views# Create a router and register our viewsets with it.
router DefaultRouter()
router.register(rstudents, views.StudentViewSet)# The API URLs are now determined automatically by the router.
urlpatterns [path(, include(router.urls)),
]
向路由器注册视图集类似于提供urlpattern。我们包含两个参数——视图的URL前缀和视图集本身。
我们正在使用的DefaultRouter类也会自动为我们创建API根视图。 五、视图与视图集之间的取舍
使用视图集是一种非常有用的抽象。它有助于确保你的API的URL约定的一致性最小化你需要编写的代码量并且允许你专注于你的API的交互和表示而不是URL conf的细节。 这并不意味着它总是正确的方法。在使用基于类的视图而不是基于函数的视图时也需要考虑类似的权衡。与单独构建视图相比使用视图集不那么显式。