首页 > 其他分享 >drf之自动生成路由

drf之自动生成路由

时间:2023-06-10 17:14:18浏览次数:35  
标签:视图 生成 framework 路由 action router 图集 drf

自动生成路由的前提是必须继承了ViewSetMixin及其子类的视图类,才能用

一 路由映射

eg:
  path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
  path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

 

二 路由Routers

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

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

2.1 使用方法

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

from rest_framework import routers

router = routers.SimpleRouter()
router.register('books', 视图类, 'books')

 

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))
]

 

2.2 代码演示

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

# 必须是继承ModelViewSet的视图类才能自动生成路由
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
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动作的声明。

2.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=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/get_new_5/$    name: router_stu-get_new_5
^router_stu/{pk}/login/$   name: router_stu-login

 

标签:视图,生成,framework,路由,action,router,图集,drf
From: https://www.cnblogs.com/shajue/p/17471557.html

相关文章

  • 迭代器与生成器
    迭代器迭代器可以记住元素的位置只会往前不能往后可以用iter()创建迭代器对象用next()打印出来,可以看到第一个next()的值只会打印第一个可以用for循环遍历出来,for循环是一个特殊的迭代器list1=[1,2,3,4]#创建迭代器对象a=iter(list1)print(next(a))print(ne......
  • Python+matplotlib绘制多门课程学生成绩分布饼状图
    封面图片:《Python程序设计实验指导书》,董付国,清华大学出版社=================饼状图比较适合展示一个总体中各个类别所占的比例,例如商场年度营业额中各类商品、不同员工的占比,家庭年度开销中不同类别的占比等。扩展库matplotlib.pyplot中的pie()函数可以用来绘制饼状图,语法如下:pie......
  • 使用zxing来生成二维码
    使用zxing来生成二维码二维码已经成为了现代生活中不可或缺的一部分,无论是商业还是个人使用,二维码都有着广泛的应用。而在二维码的生成过程中,zxing是一款非常优秀的开源库,它提供了一系列的API,可以帮助我们快速、方便地生成二维码。接下来,我们就来介绍一下如何使用zxing来生成二......
  • 微课--Python生成器函数定义与使用(19分钟)
    8.5 生成器函数定义与使用(书稿节选)如果函数中包含yield语句,那么调用这个函数得到的返回值不是单个值,而是一个包含若干值的生成器对象,这样的函数也称生成器函数。代码每次执行到yield语句时,返回一个值,然后暂停执行,当通过内置函数next()、for循环遍历生成器对象元素或其他方式显式......
  • vuex使用,Router使用(做两个主页面的跳转),路由守卫(对路由进行权限控制),路由的工作模式
    vuex使用使用的流程文件中的代码前端页面<template><div><h1>使用vuex</h1>购物车商品数量:{{num}}购物车的数量:{{$store.state.num}}<br><button@click="yjx">加数量</button></div></template><sc......
  • 蛋白质是如何生成的
    蛋白质的生成过程称为蛋白质合成或蛋白质生物合成,它发生在细胞内的核糖体中。蛋白质合成包括两个主要的步骤:转录和翻译。转录(Transcription):转录是指将DNA中的基因信息转录成RNA的过程。在细胞核中,DNA的两条链解开,其中一条链作为模板,由RNA聚合酶酶依据碱基配对原则合成与DNA模......
  • 详解Angular路由之子路由
    原文:https://www.jb51.net/article/213074.htm一、子路由语法二、实例1、新建2个组件修改其内容2、修改路由配置3、修改product.component.ts的模版一、子路由语法二、实例在商品详情页面,除了显示商品id信息,还显示了商品描述,和销售员的信息。通过子路由实现商品......
  • 路由器学习之MPLS
    1.主机不会发送和接收携带标签的数据包,因而需要特定路由器为数据包添加标签并由其他路由器去除标签,标签压入和弹出动作2.MPLS依赖CEF(思科快速转发),路由器根据动态路由协议、静态路由、直连路由创建RIB(路由信息库),之后创建FIB(转发信息库)。3.LSR(标签交换路由器,labelswitchrouter)......
  • 详解Python生成器函数和生成器对象的原理和用法
    包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。yield语句与return语句的作用相似,都是用来从函数中返回值。与return语句不同的是,return语句一旦执行会立刻结束函数的运行,而每次执行到yield语句并返回一个值之后会暂停后面代码的执行,下次通过生成器对象的__n......
  • 一个根据字母,数字和符号组合生成指定长度密码的简单方法
    前言:网上没有太好的直接可用的方法,于是自己写了一个,下面的方法可以根据字母,数字和符号组合生成指定长度密码,策略和长度可控,详细代码如下: ///<summary>///生成密码///</summary>///<paramname="zmLength">小写字母长度</param>///<paramname="upzmLength">大写......