django-14-视图集和路由

前言

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

这里我们使用ModelViewSet类自动提供完整的默认读和写操作集。仍然设置querysetserializer_class属性,与使用常规视图时完全相同,但再不用写成两个类视图。

二、显示的将视图集绑定到url

为了更好的理解视图集,我们显示的从视图集创建一组视图,然后绑定到路由上。

from crm.views import StudentViewSet
from rest_framework import renderers

# key:请求方法;value:执行的函数视图
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'
})

在视图集类上调用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'),
])

三、使用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)),
]

只需要提供url前缀,路由器会自动按照规则进行路由。

在上面的案例中,会创建两条路由:

  • /students/:会映射学生创建和学生列表视图
  • /students/<pk>/: 会映射学生查看,更新和删除视图

且还会创建对应的内容协商后缀路由。

四、视图与视图集之间的取舍

视图集高度封装,会简化代码编写,但逻辑结构不那么显式。

视图和视图集的取舍要根据实际情况。如果需要体现工作量肯定要使用普通视图,哈哈开个玩笑。

个人认为,如果只是对数据的普通增删改查,建议使用视图集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值