1.路由router

对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。

REST framework提供了两个router

  • SimpleRouter

  • DefaultRouter

1.1 使用方法

1) 创建router对象,并注册视图集,例如

from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'router_stu', StudentModelViewSet, base_name='student')

register(prefix, viewset, base_name)

  • prefix 该视图集的路由前缀

  • viewset 视图集

  • base_name 路由别名的前缀

如上述代码会形成的路由如下:

^books/$    name: book-list
^books/{pk}/$ name: book-detail

2)添加路由数据

可以有两种方式:

urlpatterns = [
...
]
urlpatterns += router.urls 或
urlpatterns = [
...
url(r'^', include(router.urls))
]

使用路由类给视图集生成了路由地址

from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class StudentModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer

def login(self,request):
"""学生登录功能"""
print(self.action)
return Response({"message":"登录成功"})

路由代码:

from django.urls import path, re_path
from . import views
urlpatterns = [
...
]

"""使用drf提供路由类router给视图集生成路由列表"""
# 实例化路由类
# drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样
from rest_framework.routers import DefaultRouter
router = DefaultRouter()

# 注册视图集
# router.register("路由前缀",视图集类)
router.register("router_stu",views.StudentModelViewSet)

# 把生成的路由列表追加到urlpatterns
print( router.urls )
urlpatterns += router.urls

上面的代码就成功生成了路由地址[增/删/改/查一条/查多条的功能],但是不会自动我们在视图集自定义方法的路由。

所以我们如果也要给自定义方法生成路由,则需要进行action动作的声明。

1.2 视图集中附加action的声明

在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。

action装饰器可以接收两个参数:

  • methods: 声明该action对应的请求方式,列表传递

  • detail

    : 声明该action的路径是否与单一资源对应,及是否是

    xxx/<pk>/action方法名/
    • True 表示路径格式是xxx/<pk>/action方法名/

    • False 表示路径格式是xxx/action方法名/

举例:

from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action

class StudentModelViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer

# methods 设置当前方法允许哪些http请求访问当前视图方法
# detail 设置当前视图方法是否是操作一个数据
# detail为True,表示路径名格式应该为 router_stu/{pk}/login/
@action(methods=['get'], detail=True)
def login(self, request,pk):
"""登录"""
...

# detail为False 表示路径名格式应该为 router_stu/get_new_5/
@action(methods=['put'], detail=False)
def get_new_5(self, request):
"""获取最新添加的5个学生信息"""
...

由路由器自动为此视图集自定义action方法形成的路由会是如下内容:

^router_stu/get_new_5/$    name: router_stu-get_new_5
^router_stu/{pk}/login/$ name: router_stu-login

1.3 路由router形成URL的方式

1) SimpleRouter

2)DefaultRouter

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

ok

最新文章

  1. Hadoop之HDFS文件读写过程
  2. Redis学习 - 配置属性:bind
  3. HTML 学习笔记 JavaScript(简介)
  4. android studio不能创建android项目,或者不能识别android项目的解决方法
  5. 区分.net、c#、asp.net三者间的关系
  6. java反射机制(笔记)
  7. 共享bean
  8. 使用QT 4.8.6 + Cmake 3.0.0 编译 最新版本OpenCv3.0.0
  9. List分组 用于客服对话分组场景
  10. 系统内置委托:Func/Action
  11. Linux中python3,django,redis以及mariab的安装
  12. c++ 指针、引用和取值;
  13. robotframework之去除空格、去掉前面的0、增加空格换行符的方法,两个字符之间的拼接
  14. 从零起步做到Linux运维经理, 你必须管好的23个细节
  15. Mybatis批量插入返回自增主键(转)
  16. Linux双线双网卡双IP双网关设置方法
  17. Python3 tesseract加载chi_sim异常停止工作
  18. 【java8】为java8的foreach正名
  19. 用Python开始机器学习(3:数据拟合与广义线性回归)
  20. Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)

热门文章

  1. BZOJ 4999 LCA树状数组差分维护DFS序
  2. jmeter之HTTP信息管理器、正则表达式联合使用(获取登录session
  3. DirectX屏幕捕获和输出视频
  4. 清华集训2014 sum
  5. 有关pip报错的问题
  6. 17.树的子结构(python)
  7. css-div中文字过多(内容超出div宽度)后自动换行
  8. 洛谷P3943 星空——题解
  9. 论文阅读:Andromeda: Performance, Isolation, and Velocity at Scale in Cloud Network Virtualization (全文翻译用于资料整理和做PPT版本,之后会修改删除)
  10. 【转】博弈论&mdash;&mdash;acm