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中提供了自动生成路由的方法

  1. 导入routers模块,有两个类,SimpleRouter和DefaultRouter
  2. 实例化类得到对象
  3. 注册
  4. router.urls中得到自动生成的路由(列表形式)
  5. 把生成的路由列表加到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做一些扩展

  1. rest_framework.decorators import action

  2. 在继承了ModelViewSet的视图类中,需要加上路由的视图函数上面写装饰器

    @action(method=[’GET’,],detail=False)

  3. 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
原文地址:https://www.cnblogs.com/telecasterfanclub/p/13274963.html