视图集和路由器
# 视图集和路由器
REST framework中还有一个视图集的概念,在通用类视图的基础上更进一步的封装。
视图集在路由匹配的最后一刻被实例化为一组视图,通过Router
类实例来进行路由绑定。
# 使用视图集重构
接下来,我们使用视图集重构学生管理视图。
class StudentViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Student.objects.all()
serializer_class = StudentSerializer
1
2
3
4
5
6
7
2
3
4
5
6
7
这里我们使用ModelViewSet
类自动提供完整的默认读和写操作集。仍然设置queryset
和serializer_class
属性,与使用常规视图时完全相同,但再不用写成两个类视图。
# 显式地将视图集绑定到url
为了更好的理解视图集,我们显示的从视图集创建一组视图,然后绑定到路由上。
from crm.views import StudentViewSet
from rest_framework import renderers
student_list_create = StudentViewSet.as_view({
'get': 'list',
'post': 'create'
})
student_retrieve_update_delete = StudentViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
在视图集类上调用as_view
方法,传入一个字典,为不同的http方法绑定对应的响应方法,该方法返回对应的视图。
现在可以向对普通视图一样,将其绑定到对应的路由上。
urlpatterns = format_suffix_patterns([
path('students/', student_list_create, name='student-list'),
path('students/<int:pk>/', student_retrieve_update_delete, name='student-detail'),
])
1
2
3
4
2
3
4
# 使用Routers
视图集绑定到路由的操作是固定的,可以通过路由器类来完成。
这是我们重新连接的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(r'students', views.StudentViewSet)
# The API URLs are now determined automatically by the router.
urlpatterns = [
path('', include(router.urls)),
]
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
只需要提供url前缀,路由器会自动按照规则进行路由。
在上面的案例中,会创建两条路由:
/students/
:会映射学生创建和学生列表视图/students/<pk>/
: 会映射学生查看,更新和删除视图
且还会创建对应的内容协商后缀路由。
# 视图与视图集之间的取舍
视图集高度封装,会简化代码编写,但逻辑结构不那么显式。
视图和视图集的取舍要根据实际情况。如果需要体现工作量肯定要使用普通视图,哈哈开个玩笑。
个人认为,如果只是对数据的普通增删改查,建议使用视图集。
本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

上次更新: 2022/12/26, 16:59:39