1. Routers
使用视图集时,除了可以自己手动在 as_view() 中添加字典来指明请求方式与动作 action 之间的对应关系外,还可以使用 Routers 来帮助我们快速实现路由信息。
REST framework 提供了两个 router
- SimpleRouter
- DefaultRouter
2. SimpleRouter
导入语句:from rest_framework import routers
使用方法
- 创建 router 对象,并注册视图集,如下示例
from rest_framework import routers
router = routers.SimpleRouter() # 实例化
router.register('books', views6.BookView, 'books') # 注册
- 使用的方法:
register(self, prefix, viewset, basename=None)
- prefix: 该视图集的路由前缀
- viewset: 视图集,可以是视图类名
- base_name: 路由别名的前缀
- 此时打印
router.urls
路由如下示例
[
<URLPattern '^books/$' [name='books-list']>,
<URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']>
]
- 需要将该路由添加到
urlpatterns
中,有俩种方式
- 方法一,将俩个列表相加
urlpatterns = [
...
]
urlpatterns += router.urls
- 方法二,使用 include
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
实际使用
- 视图类
from rest_framework.viewsets import ViewSet, GenericViewSet, ModelViewSet
class BookView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer
# 注意,该方法不能自动加入到路由,需要使用 action 配置
def login(self, request):
print(self.action)
return Response({'code': 101})
- 路由
from django.contrib import admin
from rest_framework import routers
from app01.view import views
from django.urls import path, include
router = routers.SimpleRouter() # 实例化
router.register('books', views.BookView, 'books') # 注册
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
这样就自动的添加了路由地址即:增、删、改、查一条、查多条的功能。只不过自己自定义的方法不会被添加。
3. action 装饰器
若要将自定义的方法也添加进去。可以使用 action 装饰器 来实现。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
导入语句:rest_framework.decorators.action
action(methods=None, detail=None, url_path=None, url_name=None, **kwargs)
主要属性
-
methods:声明该 action 对应的请求方式,使用列表传递
-
detail:声明该 action 的路径是否与单一资源对应
-
url_path:如果不写,就是函数名生成的路径
-
url_name:别名
实际使用
from rest_framework.decorators import action
class UserView(ModelViewSet):
queryset = models.MyUser.objects
serializer_class = UserSerializer
@action(methods=['post'], detail=False, url_path='login')
def login(self, request, **kwargs):
...
路由
from django.contrib import admin
from rest_framework import routers
from app01.view import views
from django.urls import path, include
router = routers.SimpleRouter() # 实例化
router.register('login', views.UserView, 'login') # 注册
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
未添加装饰器
已添加装饰器,detail 为 False
已添加装饰器,detail 为 True
4. 路由router形成URL的方式
-
SimpleRouter
-
DefaultRouter
DefaultRouter与SimpleRouter的区别
DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。