drf之路由层

发布时间 2023-04-24 21:14:41作者: 树苗叶子

简介

当我们使用了ModelViewSet配置视图层之后,需要在as_view中定义对应字典,如下:

urlpatterns = [
    path('book/', views.BookView.as_view({'get': 'list', 'post': 'create'})),
    path('book/<int:pk>/', views.BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]

上面的配置方法非常麻烦,想一下,如果我们有多个接口,多个路由,配置起来会非常复杂,所以drf提供了一个方法,可以自动生成路由

原理

自动生成路由的本质就是自动做映射,映射关系如下:

           get    --->  list
           get    --->  retrieve
           put    --->  update
           post   --->  create
           delete --->  destory

所以,使用自动化生成路由的前提是

  1. 改写了as_view方法,也就是继承了ViewSetMixin
  2. 需要有list/retrieve/update/create/destory中的一个或多个方法,也就是继承了9个视图子类
  3. 也可以使用GenericAPIView加5个试图扩展类,再配合ViewSetMixin才能生成
  • 九个视图子类如下
视图子类 说明
ListAPIView 查询所有数据
CreateAPIView 新增一条数据
ListCreateAPIView 查询所有数据+新增一条数据
RetrieveAPIView 查询一条数据
DestroyAPIView 删除数据
UpdateAPIView 修改数据
RetrieveUpdateAPIView 查询一条数据+修改数据
RetrieveDestroyAPIView 查询一条数据+删除数据
RetrieveUpdateDestroyAPIView 查询一条数据+修改数据+删除数据
  • 五个视图扩展类如下
    | 名称 | 说明 | 方法 |
    | ------------------ | ------------ | -------- |
    | ListModelMixin | 查询所有数据 | list |
    | RetrieveModelMixin | 查询单条数据 | retrieve |
    | CreateModelMixin | 新增一条数据 | create |
    | UpdateModelMixin | 修改一条数据 | update |
    | DestroyModelMixin | 删除一条数据 | destroy |

自动生成路由

首先,需要在视图类中使用ModelViewSet,因为自动生成路由会把自动生成与ModelViewSet中的方法的对应的关系。

from django.contrib import admin
from django.urls import path, include
from app01 import views

# 第一步,导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter

# 第二步,实例化对象
router = SimpleRouter()   # 不会生成根路由
或
router = DefaultRouter()  # 会生成根路由
# 第三步,注册路由
    # 第一个参数books:参数路径,与就是前端访问的时候的路由,但是不带最后的斜杠符咒("/")
    # 第二个参数views.BookView:是对应的视图类
    # 第三个参数books:路由的别名,一般与路由相同
router.register('book', views.BookView, 'book')

# 下面的是django自带的路由,不需要动
urlpatterns = [
    path('admin/', admin.site.urls),
]

# 第四步,在urlpatterns(django自动生成的)中注册,有两种方法
# 方法一:
urlpatterns += router.urls
# 方法二:使用include方法,使用较多,但需要在from django.urls import path, include多导一个include
# 注意这个方法需要改写urlpatterns
urlpatterns = [
    path('admin/', admin.site.urls),
    # 用这种方法的定制路由更文件一些,这时浏览器访问的就是http://127.0.0.1/api/v1/book/
    path('api/v1/', include(router.urls))
]

SimpleRouter与DefaultRouter的区别

在Django Rest Framework(DRF)中,SimpleRouter和DefaultRouter是两种不同的路由器类型。

SimpleRouter是一种简单的路由器,它只会为ViewSet中自定义的操作生成URL,例如你的ViewSet中定义了名为latest的操作,则SimpleRouter只会为latest生成URL。

DefaultRouter是一种全面的路由器。它为ViewSet中所有标准操作(如list、retrieve、update、create等)生成URL,并为自定义操作生成名称。它还为所配置的API浏览器提供了根URL。

如果你想获得一个简单的API,只有少量自定义操作,那么使用SimpleRouter会比较方便,并且可以通过手动添加URL来自定义路由。而如果你需要完整的API,包括标准操作和自定义操作,那么使用DefaultRouter会更加方便,并且能够快速自动生成URL。

简单来说,SimpleRouter比DefaultRouter自由度更高,而DefaultRouter比SimpleRouter更加全面。根据实际情况选择合适的路由器更为重要。