心蓝的博客 心蓝的博客
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

心蓝

人生苦短,我用python
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • 零基础

  • 专项

  • web框架

    • django框架

    • drf

      • 简介
      • 序列化器
      • 请求和响应
      • 类视图
      • 视图集和路由器
        • 使用视图集重构
        • 显式地将视图集绑定到url
        • 使用Routers
        • 视图与视图集之间的取舍
      • 序列化器补充
      • 身份验证与权限
      • 分页与限流
  • python
  • web框架
  • drf
心蓝
2022-12-26
目录

视图集和路由器

# 视图集和路由器

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

这里我们使用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

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

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

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

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

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

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

# 视图与视图集之间的取舍

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

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

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

本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

#drf
上次更新: 2022/12/26, 16:59:39
类视图
序列化器补充

← 类视图 序列化器补充→

最近更新
01
requests让接口测试如此简单 原创
03-31
02
最简明的python正则教程
03-30
03
pycharm激活码
12-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 心蓝
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式