DRF之视图常用功能详解

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

猜你喜欢

转载自www.cnblogs.com/fqh202/p/9609708.html