drf --- 路由Routers以及action装饰器声明自定义方法
一、REST framework提供了两个router类
- 作用:可以使用Routers来帮助我们快速实现路由信息。
1.SimpleRouter
使用方法
- 1.创建router对象,并注册视图集
- router = routers.SimpleRouter()
- router.register(prefix, viewset, base_name)
- prefix :该视图的路由路径,例如:127.0.0.1:8000/student/ 中的student
- viewset:视图函数中定义的视图集
- base_name:该路由的别名,可选参数
- 2.添加路由(两种方式)
- 方式一:
urlpatterns = [
...
]
urlpatterns += router.urls
- 方式二:
urlpatterns = [
...
url(r'^', include(router.urls))
]
路由代码示例:
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
2.DefaultRouter
- 使用方法:该类的使用方法与SimpleRouter基本一样
- 区别:DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。
二、action装饰器声明自定义方法
- Routers的缺点:虽然上面的代码可以成功生成路由地址,单不会自动生成我们在视图集中自定义的方法路由
- 解决办法:用action装饰器,进行声明
- 导入action装饰器 : from rest_framework.decorators import action
- action装饰器的3个参数:
- methods : 声明该action对应的请求方式,列表传递
- detail : 声明该action的路径是否与单一资源对应
- detail = True :表示路径的格式为 xxx/
/action方法名/ - detail = False:表示的路径格式为 xxx/action方法名/
- detail = True :表示路径的格式为 xxx/
- url_path :可设置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个学生信息"""
...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通