drf之路由组件
drf之路由组件
快速配置
在上篇博客之前,我们都是手写路由,去配置url
# 普通写法
path('books4/', views.Book4View.as_view()),
re_path('books4/(?P<pk>\d+)', views.Book4DetailView.as_view()),
# 继承了ViewSetMixin,要加上action
path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})),
# 当路径匹配,又是get请求,会执行Book5View的list方法
re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
drf中提供了自动生成路由的方法
- 导入routers模块,有两个类,SimpleRouter和DefaultRouter
- 实例化类得到对象
- 注册
- router.urls中得到自动生成的路由(列表形式)
- 把生成的路由列表加到urlpaterns里
# urls.py
from app01 import views
from rest_framework import routers
# 导入router模块
router = routers.SimpleRouter()
# 使用routers模块之一,简单路由
router.register('books',views.BookViewSet)
# 注册,第一个参数填url的后缀,相当于urlpatterns里的正则匹配,第二个参数写触发的试图类(继承了ModelViewSet)
# router.url会生成一个列表,里面是两条url
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
urlpatterns += router.urls
# router.url与urlpatterns拼接,就可以访问到url了
# views.py
class BookViewSet(ModelViewSet):
# 需要继承这个类,才能自动生成路由
queryset = models.Book.objects
serializer_class = ser.BookSerializer
除了SimpleRouter,还有DefaultRouter,生成的列表中会多出来4个url,还支持用有名分组format接收类似.html,.json这种后缀
action的使用
自动生成路由后,我们原本在写APIView时候,视图中的get,post这些方法,彻底封装进去了。如果需要使用这些以外的视图函数,也可以用action做一些扩展
-
rest_framework.decorators import action
-
在继承了ModelViewSet的视图类中,需要加上路由的视图函数上面写装饰器
@action(method=[’GET’,],detail=False)
-
detail=False表示生成不带pk的地址,=True则会生成一个有名分组,接收一个pk值
class BookViewSet(ModelViewSet):
# 需要继承ModelViewSet
queryset = models.Book.objects
serializer_class = ser.BookSerializer
@action(methods=['GET'],detail=False)
# method里面方法大写小写都可以识别
# 如果detail是True,要多写一个形参接收pk值
# 别的写法和普通GenericAPIView一样,要手动返回Response
def bookAction(self,request):
return Response({'msg':'action'})
这里可以看到,已经新加了一个ur,其中url的后缀就是视图函数的函数名
总结一下
drf提供的一个装饰器,放在被装饰的视图函数上方,method是请求方式,detail指定是否带pk参数,视图函数的函数名作为url的后缀。我们可以用action来给自定义视图函数自动生成路由
视图继承关系
以下是一些视图的继承关系
#两个基类
APIView
GenericAPIView:有关数据库操作,queryset 和serializer_class
#5个视图扩展类(rest_framework.mixins)
CreateModelMixin:create方法创建一条
DestroyModelMixin:destory方法删除一条
ListModelMixin:list方法获取所有
RetrieveModelMixin:retrieve获取一条
UpdateModelMixin:update修改一条
#9个子类视图(rest_framework.generics)
CreateAPIView:继承CreateModelMixin,GenericAPIView,有post方法,新增数据
DestroyAPIView:继承DestroyModelMixin,GenericAPIView,有delete方法,删除数据
ListAPIView:继承ListModelMixin,GenericAPIView,有get方法获取所有
UpdateAPIView:继承UpdateModelMixin,GenericAPIView,有put和patch方法,修改数据
RetrieveAPIView:继承RetrieveModelMixin,GenericAPIView,有get方法,获取一条
ListCreateAPIView:继承ListModelMixin,CreateModelMixin,GenericAPIView,有get获取所有,post方法新增
RetrieveDestroyAPIView:继承RetrieveModelMixin,DestroyModelMixin,GenericAPIView,有get方法获取一条,delete方法删除
RetrieveUpdateAPIView:继承RetrieveModelMixin,UpdateModelMixin,GenericAPIView,有get获取一条,put,patch修改
RetrieveUpdateDestroyAPIView:继承RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView,有get获取一条,put,patch修改,delete删除
#视图集
ViewSetMixin:重写了as_view
ViewSet: 继承ViewSetMixin和APIView
GenericViewSet:继承ViewSetMixin, generics.GenericAPIView
ModelViewSet:继承mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
ReadOnlyModelViewSet:继承mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet