drf第四日
一 2个视图基类
-
Django REST framwork(drf) 提供的视图的主要作用:
控制序列化器的执行(检验、保存、转换数据)
控制数据库查询的执行 -
APIView
:继承了原生Django的View -
GenericAPIView
:继承了APIView
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
get_queryset
:获取配置的queryset
get_object
:路由中的分组字段必须是pk
get_serializer
:获取配置的序列化类 -
最终总结
APIView
:如果跟models没有关系(没有数据库相关操作),就继承它
GenericAPIView
:有关数据库操作,queryset 和serializer_class
二 5个视图扩展类
五个类
#5个视图扩展类(from rest_framework.mixins import ...)
CreateModelMixin:create方法创建一条 对应post
DestroyModelMixin:destory方法删除一条 对应delete
ListModelMixin:list方法获取所有 对应get
RetrieveModelMixin:retrieve获取一条 对应正则get
UpdateModelMixin:update修改一条 对应put
使用时要继承这些类中的方法,比如接收get与post时
from rest_framework.mixins import ListModelMixin, CreateModelMixin
class BookGeneric(GenericAPIView, ListModelMixin, CreateModelMixin): # 这个类接收get与post请求
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
def get(request, *args, **kwargs):
return list(request, *args, **kwargs) # 最后由ListModelMixin下的list方法处理
def post(request, *args, **kwargs):
return create(request, *args, **kwargs) # 最后由CreateModelMixin下的create方法处理
三 9个子类视图
9个子类视图(from rest_framework.generics import …)
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删除
四 视图集
引入语法:from rest_framework.viewsets import ...
ViewSetMixin
:重写了as_view
ViewSet
: 继承ViewSetMixin和APIView
GenericViewSet
:继承ViewSetMixin, generics.GenericAPIView
ModelViewSe
t:继承mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet
ReadOnlyModelViewSet
:继承mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet
案例:
# views.py
from rest_framework.viewsets import ModelViewSet
class BookSetView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# urls.py
path('books_set/', views.BookSetView.as_view({'get':'list','post':'create'})),
re_path('^books_set/(?P<pk>\d+)',views.BookSetView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
五 路由配置
只要继承了ViewSetMixin
类
路由配置就会变成类似:path('books_mix/', views.BookView.as_view({'get':'lqz'}))
视图类的方法中就会有个action
class BookView(ViewSet): # ViewSet继承了ViewSetMixin
def lqz(self,request,*args,**kwargs):
print(self.action)
return Response('lqz')
ViewSetMixin
以后只要继承它,路由的配置就发生变化了,只需要写映射即可
六 自动生成路由
继承了ViewSetMixin的视图类,以后写路由,可以使用这个自动生成
引入语法:from rest_framework import routers
其中有两个方法来生成
1. SimpleRouter
2. DefaultRouter
步骤:
- 实例化得到一个对象
router = routers.SimpleRouter()
- 注册进路由
router.register('books', views.BookSetView)
- 把自动生成的路由配置到urlpatterns中
两种方法:urlpatterns += router.urls
re_path(r'v1/', include(router.urls))
三种配置路由的方式(回顾)
- 最原始的
path('books/', views.BookAPIView.as_view()),
- 需要先继承
ViewSetMixin
的视图类
path('books_set/', views.BookSetView.as_view({'get':'list','post':'create'}))
- 需要先继承
ViewSetMixin
的视图类
router
自动生成,上面讲的
七 action的使用
当用router
自动生成路由的时候,由于视图类中还有其它方法,是无法自动生成路由的
解决方法加:action
装饰器:
methods
:什么请求方式会触发被装饰函数的执行
detail
:是True
是基于带id的路由生成的(正则分组),如果是False
,是基于不带id的路由生成的(死路径)
class BookSetView(ModelViewSet):
@action(methods=['get'], detail=True)
def ddd(request, *args, **kwargs):
...