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
视图集
路由配置:
视图:
源码分析:
ViewSetMixin里的as_view
以后视图类中方法名可以随意命名,只要路由做好映射:
例如:在视图类中写一个login方法,然后路由匹配成如下所示,就可以执行login
继承的类是:ViewSetMixin
视图类中方法任意命名,路由根据其一起变化。
-get_object
-get_queryset
-get_serializer
-某几个接口:查询单条,新增一条,的接口--->使用5个视图扩展类+GenericAPIView
ListAPIView, CreateAPIView ListCreateAPIView
RetrieveAPIView, DestroyAPIView, UpdateAPIView
RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView
ViewSetMixin源码:路由做映射的配置,以后视图类中方法可以随便命名
Viewset:ViewSetMixin+APIView---》不需要要序列化,路由写法变了
GenericViewSet:ViewSetMixin+GenericAPIView--》需要序列化,需要用数据库,路由写法变化
ReadOnlyModelViewSet:list和retrieve
{'get': 'list', 'post': 'create'}
{'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}
其他的视图类中有别的方法,我们做映射,需要使用装饰器
drf路由使用方法(SimpleRouter DefaultRouter):
大前提:必须是继承ViewSetMixin+APIView及其子类才能自动生成
使用步骤:
url.py中
1、导入路由类:
SimpleRouter, DefaultRouter区别
-DefaultRouter生成的路径多一个根路径 api-root
-DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据
以后就用:SimpleRouter就可以
@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
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
print(self.action)
视图类的对象中有个action属性---》它是当次请求执行的方法名的字符串
通过action可以限制视图类中某个方法使用的序列化类是哪个
importlib的使用
importlib
是Python3.1增加的系统库,其中最常用的函数是其中的import_module
,功能是用程序语句的方式替代import
语句,用法如下: