Django学习 day80之drf第四日

一 2个视图基类

  1. Django REST framwork(drf) 提供的视图的主要作用:
    控制序列化器的执行(检验、保存、转换数据)
    控制数据库查询的执行

  2. APIView:继承了原生Django的View

  3. GenericAPIView:继承了APIView
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookModelSerializer
    get_queryset:获取配置的queryset
    get_object:路由中的分组字段必须是pk
    get_serializer:获取配置的序列化类

  4. 最终总结
    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

ModelViewSet:继承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
步骤:

  1. 实例化得到一个对象
    router = routers.SimpleRouter()
  2. 注册进路由
    router.register('books', views.BookSetView)
  3. 把自动生成的路由配置到urlpatterns中
    两种方法:
    1. urlpatterns += router.urls
    2. re_path(r'v1/', include(router.urls))

三种配置路由的方式(回顾)

  1. 最原始的
    path('books/', views.BookAPIView.as_view()),
  2. 需要先继承ViewSetMixin的视图类
    path('books_set/', views.BookSetView.as_view({'get':'list','post':'create'}))
  3. 需要先继承ViewSetMixin的视图类
    router自动生成,上面讲的

七 action的使用

当用router自动生成路由的时候,由于视图类中还有其它方法,是无法自动生成路由的
解决方法加:action装饰器:
methods:什么请求方式会触发被装饰函数的执行
detail:是True是基于带id的路由生成的(正则分组),如果是False,是基于不带id的路由生成的(死路径)

class BookSetView(ModelViewSet):
	@action(methods=['get'], detail=True)
	def ddd(request, *args, **kwargs):
		...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值