DRF-视图家族

视图家族:

'''
1)  views:视图类 -两个 -->APIViews,GenericAPIView(generics中)
2)  mixins:视图工具类 - 五个类,六个方法
3)  generics:工具视图类 - 九种组合
4)  viewsets:视图集:两个视图基类、两个视图子类、一个工具类
'''

视图类

#1、APIView:
#1)拥有View的所有  2)重写as_view  3)重写dispatch  4)一系列类属性

#APIView
class CarView(APIView):
    def get(self):
        obj,
        ser,
        response,
        
#2、GenericAPIView
#1)继承APIView,所以拥有APIView的所有
#2)get_queryset方法,配置queryset类属性,提供视图类相关的Models
#3)在第二条基础上,get_object方法,配置lookup_url_kwarg类属性,提供视图类相关的具体Model
#4)get_serializer方法,配置serializer_class类属性,提供视图类相关的序列化对象

#GenericAPIView
class CarView(GenericAPIView):  # 不会出现,中间产物
   #这里需要注意:虽然源码给我们已经加了all(),但是在源码中也判断了我们传送的是不是queryset对象。
   #所以在查数据库的时候不能直接写到objects结束,因为objects结束时,不是QuerySet对象,而是Manager对象,但 .all() 和 .filter() 后一定是QuerySet对象
    queryset,
    serializer_class,
    lookup_url_kwarg,
    def get(self):
        obj,
        ser,
        response,
'''
总结:GenericAPIView就是在APIView基础上额外提供了三个方法,三个类属性,如果不配合视图工具类,体现不出优势
目的:视图中的增删改查逻辑相似,但操作的资源不一致,操作资源就是操作 资源对象们、资源对象以及资源相关的序列化类,
将这三者形成配置,那操作逻辑就一致,就可以进行封装
'''
    

视图工具类

#mixins视图工具类们:
#五个类:CreateModelMixin,ListModelMixin,RetrieveModelMixin,DestroyModelMixin UpdateModelMixin
#1)要配合GenericAPIView类使用,将单查、群查、单增,单整体改,单局部改,单删六个接口
#封装成retrieve、list、create、update、partial_update、destroy六个方法
#原因:六个方法的实现体,调用的方法就是GenericAPIView提供的,所以要配合GenericAPIView类使用
class CarView(RetrieveModelMixin, GenericAPIView):  # 自定义组合,可以超过九种
    queryset,
    serializer_class,
    lookup_url_kwarg,
    def get(self):
        self.retrieve()
        

工具视图类

#generics工具视图类们:九种组合
#1)帮我们将不同个数不同种类的mixins与GenericAPIView进行组合
#2)不同的组合帮我们实现好对应的get、post、put、patch、delete方法
#3)需要我们自己配置三个类属性即可:queryset、serializer_class、lookup_url_kwarg
#九种组合:
''' 1.CreateAPIView 单增
    2.DestroyAPIView 单删
    3.ListAPIView 群查
    4.ListCreateAPIView 群查、单增
    5.RetrieveAPIView 单查
    6.RetrieveDestroyAPIView 单查、单删
    7.RetrieveUpdateAPIView 单查、单改
    8.RetrieveUpdateDestroyAPIView 单查、单改、单删
    9.UpdateAPIView 单改
'''

视图集

'''viewsets:视图集:
    两个视图基类:
    ViewSet(ViewSetMixin, APIView):可以自定义映射关系的APIView
    GenericViewSet(ViewSetMixin, GenericAPIView):可以自定义映射关系的GenericAPIView
    两个视图子类:
    1)ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet)
        某一资源的六大操作视图集
        
    2)ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet)
    一个工具类: GenericViewSet
'''
'''

视图集总结:
核心:视图集都继承了 ViewSetMixin类,该类重写了as_view方法,相比APIView的as_view方法,额外多出了一个参数actions
    as_view({'get': 'list'}) 传入的{'get': 'list'}就被actions介绍,原理是将get请求映射给视图类的list函数进行处理

1)为什么有GenericViewSet和ViewSet两个视图集基类
    GenericViewSet(ViewSetMixin, GenericAPIView),该分支严格满足资源接口
    ViewSet(ViewSetMixin, APIView),该分支满足的接口与资源Model类关系不是特别密切:登录接口、短信验证码接口

2)ReadOnlyModelViewSet,ModelViewSet两个视图集子类,就是做个一堆mixin与GenericViewSet相结合,
    自己在urls文件中配置as_view设置映射关系
'''

路由层

# 路由层:外面会遇到这种写法,看到了要认识
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('v7/cars', views.CarModelViewSet, basename='car')
router.register('books', views.BookModelViewSet, basename='book')
router.register('users', views.UserModelViewSet, basename='user')

#路由分发
urlpatterns = [
    #这是一种方法:
    # url(r'^v7/cars/$', views.CarModelViewSet.as_view({
    #     'get': 'list',
    #     'post': 'create',
    #     'put': 'many_update',
    #     'patch': 'many_partial_update',
    #     'delete': 'many_destroy',
    # })),
    # url(r'^v7/cars/(?P<pk>\d+)/$', views.CarModelViewSet.as_view({
    #     'get': 'retrieve',
    #     'put': 'update',
    #     'patch': 'partial_update',
    #     'delete': 'destroy',
    # })),
   
    #这是第二种方法:
    url(r'', include(router.urls))
]

猜你喜欢

转载自www.cnblogs.com/mqhpy/p/12121299.html