视图家族:
'''
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))
]