Mixin类编写视图
本质上是封装逻辑,减少部分代码。
# urls.py
url(r'^authors/$', AuthorView.as_view()), # 新增/查询所有
url(r'^authors/(?P<pk>\d+)/$', AuthorDetailView.as_view()), # 编辑/新增/删除
# views
from rest_framework import generics
from rest_framework import mixins
from .models import Author
from .my_serializer import AuthorSerializers
class AuthorView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
def get(self,request,*args,**kwargs):
return self.list(request,*args, **kwargs)
def post(self,request,*args,**kwargs):
return self.create(request,*args, **kwargs)
class AuthorDetailView(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
def get(self,request,*args,**kwargs):
return self.retrieve(request,*args, **kwargs)
def put(self,request,*args,**kwargs):
return self.update(request,*args, **kwargs)
def delete(self,request,*args,**kwargs):
return self.destroy(request,*args, **kwargs)
使用通用的基于类的视图
from rest_framework import generics
from .models import Author
from .my_serializer import AuthorSerializers
class AuthorView(generics.ListCreateAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
# ListCreateAPIView已经封装get 和 post 方法
# def get(self,request,*args,**kwargs):
# return self.list(request,*args, **kwargs)
#
# def post(self,request,*args,**kwargs):
# return self.create(request,*args, **kwargs)
class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
# RetrieveUpdateDestroyAPIView 已经封装get\put\delete 方法
# def get(self,request,*args,**kwargs):
# return self.retrieve(request,*args, **kwargs)
#
# def put(self,request,*args,**kwargs):
# return self.update(request,*args, **kwargs)
#
# def delete(self,request,*args,**kwargs):
# return self.destroy(request,*args, **kwargs)
基于viewsets实现单视图
# urls.py
url(r'^authors/$', AuthorModelView.as_view({"get":"list","post":"create"})), # 新增/查询所有
url(r'^authors/(?P<pk>\d+)/$', AuthorModelView.as_view({
"get":"retrieve",
"put":"update",
"delete":"destroy",
})),
# views.py
from .models import Author
from .my_serializer import AuthorSerializers
from rest_framework import viewsets
class AuthorModelView(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializers
源码流程
# 1、初始化前
url(r'^authors/$', AuthorModelView.as_view({"get":"list","post":"create"}))
# 2、开始初始化
url(r'^authors/$',ViewSetMixin.as_view({"get":"list","post":"create"}))
# 3、处理后:
url(r'^authors/$',ViewSetMixin.view)
def as_view(cls, actions=None, **initkwargs):
view.actions = actions
def view(request, *args, **kwargs):
pass
return csrf_exempt(view)
# 4、用户请求url,调用view函数,传入字典
def view(request, *args, **kwargs):
self = cls(**initkwargs)
self.action_map = actions
for method, action in actions.items(): {"get":"list", "post":"create"}
handler = getattr(self, action) # self.list, self.create
setattr(self, method, handler) # self.get = self.list, self.post = self.create
# getattr(self,"get") # self.list
# getattr(self,"post") # self.create
return self.dispatch(request, *args, **kwargs)
# 5、在AuthorModelView的父类中查出并调用dispatch方法,
class APIView(View):
def dispatch(self, request, *args, **kwargs):
# get = list. post = create
if request.method.lower() in self.http_method_names: # get
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) # list
response = handler(request, *args, **kwargs)
return self.response # self.list