目录

  • 一、 自动生成Routers路由
  • 二、 使用方法
    • 1) 创建router对象,并注册视图集,例如
    • 2)添加路由数据
  • 三、 代码演示
  • 四、 视图集中附加action的声明
  • 五、 自动生成路由router的两种方式的URL区别
    • 1) SimpleRouter
    • 2)DefaultRouter
  • 六、 总结

一、 自动生成Routers路由

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

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

二、 使用方法

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

from rest_framework import routersrouter = routers.SimpleRouter()
router.register(r'router_stu', views.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

from django.urls import include
urlpatterns = [path('', include(router.urls)),
]

三、 代码演示

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

# 必须是继承ViewSetMixin的视图类才能自动生成路由
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class StudentModelViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer# 这种方法不会自动生成,需要用action配置def login(self,request):"""学生登录功能"""print(self.action)return Response({"message":"登录成功"})

路由代码:

from django.urls import path, re_path
from . import views"""使用drf提供路由类router给视图集生成路由列表"""
# 实例化路由类
# drf一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样
from rest_framework.routers import DefaultRouter,SimpleRouter
router = DefaultRouter()# 注册视图集
# router.register("路由前缀",视图集类)
router.register("router_stu",views.StudentModelViewSet)urlpatterns = [...
]# 把生成的路由列表追加到urlpatterns
print( router.urls )
urlpatterns += router.urls

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

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

四、 视图集中附加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 actionclass StudentModelViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer# methods 设置当前方法允许哪些http请求访问当前视图方法# detail 设置当前视图方法是否是操作一个数据# detail为True,表示路径名格式应该为 router_stu/{pk}/login/@action(methods=['get'], detail=False)def login(self, request):return Response({'msg':'登陆成功'})@action(methods=['put'], detail=True)def get_new_5(self, request,pk):return Response({'msg':'获取5条数据成功'})

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

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

五、 自动生成路由router的两种方式的URL区别

1) SimpleRouter


2)DefaultRouter



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

六、 总结

# 补充(了解),必须继承ViewSetMixin的视图类才有
视图类有action属性,是当此请求要执行的函数名
1 自动生成路由的视图类,-需要继承ViewSetMixin+9个视图字类-需要继承ViewSetMixin+视图类(APIView。。。)+5个视图扩展类2 可以使用action的视图类,ViewSetMixin+视图类(APIView。。。)

drf-路由组件:自动生成Routers路由、 使用方法、视图集中附加action的声明、自动生成路由router的两种方式的URL区别相关推荐

  1. Vue实现动态路由的两种方式总结

    实现动态路由有两种方式,一种是后端返回什么,前端就展示什么,另一种是后端只返回角色,前端根据角色拼接数据信息展示.相比第一种方式,第二种方式在企业中更常用. 第一种方式: (一)后端需返回类似Vue- ...

  2. vue 路由传参 params 与 query两种方式的区别(转载)

    vue 路由传参 params 与 query两种方式的区别 初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  ro ...

  3. vue 路由传参 params 与 query两种方式的区别

    vue 路由传参 params 与 query两种方式的区别 初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  ro ...

  4. 详解SpringCloud-gateway动态路由两种方式,以及路由加载过程

    gateway配置路由主要有两种方式,一种是用yml配置文件,一种是写代码里,这两种方式都是不支持动态配置的.如: 下面就来看看gateway是如何加载这些配置信息的. 1 路由初始化 无论是yml还 ...

  5. vue路由传参的两种方式

    项目场景: 例如:点击table表格第一列进入详情页,这时候我们进行路由跳转就需要携带一些参数以便我们在详情页使用 跳转方式 一般我们有两种方式让路由携带参数 1.路由传参query(path是路由地 ...

  6. 【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框获取组件实例常用的两种方式...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html ...

  7. IoC(控制反转)的主要组件和注入的两种方式

    一.IoC的主要组件: (1).Spring框架的两个最基本和最重要的包是org.springframework.beans.factory(该包中的主要接口是BeanFactory)和org.spr ...

  8. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  9. maven生成war包的两种方式

    war包即对WEB应用程序进行打包,用于应用容器的部署.如在jboss中只要把war包丢入deploy目录下即可发布自己的应用了.打包方式有很多中,很多工具本身就支持此功能.下面主要介绍通过maven ...

最新文章

  1. 4图纸 rust_看完这篇,国外的图纸也能看懂
  2. Hibernate 一对一关联关系
  3. NLP:GLUE和SuperGLUE基准的简介、任务分类、使用方法之详细攻略
  4. Epoll 的tcp通信代码(服务器+客户端)
  5. leetcode100. 相同的树(dfs)
  6. cad监控图标_干货!多种不同环境的无线视频监控系统拓扑图
  7. Java面试之锁-读写锁
  8. Delphi中Chrome Chromium、Cef3学习笔记(三)
  9. David I 盛大之行及Delphi未来畅想
  10. asp.net 写入excel时,不能更新。数据库或对象为只读。
  11. python爬取网站大数据_[Python]爬虫抓取大数据职位数据
  12. 【专利提交】个人通过CPC客户端网上提交专利文稿的完整流程
  13. SpringAop实现原理
  14. Maya模型锁定不能编辑的解锁方法
  15. 中国大学慕课mooc答题/自动播放脚本(domooc)使用教程
  16. centos:/usr/bin/perl is needed by mysql-community-server
  17. java大作业网络聊天室
  18. 虚拟主机做app服务器,虚拟主机做app服务器吗
  19. uniapp [微信小程序开发工具]微信小程序在Hbuilderx运行报错:? Enable IDE Service (y/N) 
  20. 密码全安控件OCX版本发布

热门文章

  1. 智能云时代,谁来守护我们的安全?
  2. JQury实现ajax异步请求
  3. 熟读100句英文,记7000单词
  4. 详细讲解MOSFET管驱动电路(转)
  5. 今年米粉节再推爆款 3999入手安卓影像旗舰11Ultra
  6. AKM的AK09918调试驱动过
  7. 【电脑使用】修改注册表——让有密码的电脑开机自动登录
  8. 程序员怎样才能实现财富自由
  9. c8051f310烧录_C8051F烧录器-C8051F系列烧录工具下载v1.0.0.1 官方最新版-西西软件下载...
  10. 【Matlab编程】新手入门第五天