简介
当我们使用了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
所以,使用自动化生成路由的前提是
- 改写了as_view方法,也就是继承了ViewSetMixin
- 需要有list/retrieve/update/create/destory中的一个或多个方法,也就是继承了9个视图子类
- 也可以使用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更加全面。根据实际情况选择合适的路由器更为重要。