9个视图子类

视图类五层

第一层:继承APIview,五个接口

第二层:GenericAPIView,继承APIview(两个类属性+def get post get put delete)

第三层:五个视图扩展类 GenericAPIView +(RetrieveModelMixin, CreateModelMixin, DestroyModelMixin,ListModelMixin,UpdateModelMixin)(两个类属性+def get post get put delete)

第四层:9个视图子类(ListAPIView, CreateAPIView, ListCreateAPIView,RetrieveAPIView, DestroyAPIView, UpdateAPIView,RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView) (两个类属性)

第五层视图集

9个视图子类

from rest_framework.generics import ListAPIView, CreateAPIView, ListCreateAPIView
from rest_framework.generics import RetrieveAPIView, DestroyAPIView, UpdateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView

想写五个接口中的某一个或某几个或者所有,只需要选择继承不同的类即可

需要配置下列两个属性:

      queryset = 表名.objects.all()
      serializer_class = 序列化类

 

from rest_framework.generics import ListCreateAPIView,CreateAPIView,ListAPIView
from rest_framework.generics import UpdateAPIView,DestroyAPIView,RetrieveAPIView,RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView

class PublishView(ListCreateAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer

class PublishDetialView(RetrieveUpdateDestroyAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer

 

视图集

ModelViewSet:视图类继承它,需要改路由,5个接口都有

路由配置:

 视图:

 源码分析:

ViewSetMixin里的as_view

 

以后视图类中方法名可以随意命名,只要路由做好映射:

例如:在视图类中写一个login方法,然后路由匹配成如下所示,就可以执行login

 继承的类是:ViewSetMixin

视图类中方法任意命名,路由根据其一起变化。

ReadOnlyModelViewSet

以后写的接口,只想有 获取单条和获取所有,继承它

视图层中类的总结

1、两个视图基类

APIView和GenericAPIView

APIView的执行流程,包装了新的request、处理了csrf,执行了三大认证,处理全局异常

GenericAPIView:要做序列化,要和数据库打交道,就直接继承它即可。

    -queryset

    -serializer_class 

    -get_object
    -get_queryset
    -get_serializer

2、 5个视图扩展类(不是视图类),需要加上GenericAPIView才能用

  快速使用5个接口

-某几个接口:查询单条,新增一条,的接口--->使用5个视图扩展类+GenericAPIView

3、9个视图子类(继承GenericAPIView+5个视图扩展类的组合)

ListAPIView, CreateAPIView   ListCreateAPIView
RetrieveAPIView, DestroyAPIView, UpdateAPIView
RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView

4、视图集

 ModelViewSet:

  ViewSetMixin+GenericAPIView+5个视图扩展类

  GenericViewSet(就相当于ViewSetMixin+GenericAPIView)+5个视图扩展类

  ViewSetMixin源码:路由做映射的配置,以后视图类中方法可以随便命名
  Viewset:ViewSetMixin+APIView---》不需要要序列化,路由写法变了
  GenericViewSet:ViewSetMixin+GenericAPIView--》需要序列化,需要用数据库,路由写法变化
  ReadOnlyModelViewSet:list和retrieve

 

drf之路由

之前路由写法:path('books/', BookView.as_view())

继承ViewSetMixin,就变成了:path('publish/', PublishView.as_view({'get': 'list', 'post': 'create'}))

这样做映射有些麻烦,drf帮咱们封装了两个路由类,可以帮咱们快速生成这种映射关系

前提是:

必须是继承ViewSetMixin+APIView及其子类才能自动生成  SimpleRouter  DefaultRouter

自动生成的路由如下:

{'get': 'list', 'post': 'create'}
{'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}

其他的视图类中有别的方法,我们做映射,需要使用装饰器

 

drf路由使用方法(SimpleRouter  DefaultRouter):

大前提:必须是继承ViewSetMixin+APIView及其子类才能自动生成

使用步骤:

  url.py中

1、导入路由类:

from rest_framework.routers import SimpleRouter,DefaultRouter
2、类实例化得到对象
router = SimpleRouter()
3、自动生成路由,调用对象的某个方法,完成和视图类的对应关系,映射路由
router.register('publish',PublishView,'publish')   (路由,视图类,起别名)
4、把自动生成的路由,加到总路由中
urlpatterns = urlpatterns + router.urls  # 两个列表直接相加
第四步可以有另一种写法:
  加一个前缀:
    path('api/v1/', include(router.urls)), 
 # http://127.0.0.1:8008/api/v1/user/register/--->post

 

SimpleRouter, DefaultRouter

SimpleRouter, DefaultRouter区别
-DefaultRouter生成的路径多一个根路径 api-root
-DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据
以后就用:SimpleRouter就可以

 

action装饰器

其作用:为视图类中的方法做路径的映射

  这些方法排除5个:create、list、destroy、retrieve、update

使用方法:

  @action(methods=['POST'],detail=False)

  def register(self, request):
    return Response('register')

自动生成:

   http://127.0.0.1:8008/user/register/---->post--->就会执行register  

action参数
  -methods请求方式,可以写多个
  -detail:路径中是否带id号
  http://127.0.0.1:8008/user/register/ # detail=False
  http://127.0.0.1:8008/user/4/register/ # detail=True

以后继承ModelViewSet也可也能会重写好多方法

重写list

    
class PublishView(ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer
    def list(self, request, *args, **kwargs):  # 以后可能会重写list,做自己的定制
        res=super().list(request, *args, **kwargs)

        return Response({'code':100,'msg':'成功','result':res.data})

重写get_serializer_class

def get_serializer_class(self):  # 是GenericAPIView类中的方法,返回什么,以后就以哪个序列化类继续操作
    print(self.action)
    if self.request.method=='POST':
        return WritePublishSerializer
    else:
        return self.serializer_class

重写perform_create

def perform_create(self, serializer):
    serializer.save()

序列化使用PublishSerializer,反序列化使用 WritePublishSerializer   

 

视图类的对象中的action参数

print(self.action)

视图类的对象中有个action属性---》它是当次请求执行的方法名的字符串

通过action可以限制视图类中某个方法使用的序列化类是哪个

 

importlib的使用

importlib 是Python3.1增加的系统库,其中最常用的函数是其中的import_module ,功能是用程序语句的方式替代import 语句,用法如下:

 

posted @ 2023-09-05 17:34  别管鱼油我了  阅读(7)  评论(0编辑  收藏  举报