视图组件

一:基本视图

写一个出版社的增删查改resful接口

路由:

url(r'^publish/$', views.PublishView.as_view()),
url(r'^publish/(?P<pk>\d+)/$', views.PublishDetailView.as_view()),

视图:

class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model=models.Publish
        fields='__all__'

class PublishView(APIView):
    #查询所有出版社
    def get(self, request):
        publish_list = models.Publish.objects.all()
        res = PublishSerializers(publish_list, many=True)
        # 序列化数据
        return Response(res.data)
        
    #增加出版社
    def post(self, request):
        # 添加一条数据
        print(request.data)
        res=PublishSerializers(data=request.data)
        if res.is_valid():
            res.save()  # 生成记录
            return Response(res.data)
        else:
            return Response(res.errors)

class PublishDetailView(APIView):
    #查询单个出版社
    def get(self,request,pk):
        publish_obj=models.Publish.objects.filter(pk=pk).first()
        res=PublishSerializers(publish_obj,many=False)
        return Response(res.data)
        
    #修改出版社  
    def put(self,request,pk):
        publish_obj = models.Publish.objects.filter(pk=pk).first()
        res=PublishSerializers(data=request.data,instance=publish_obj)
        if res.is_valid():
            res.save() # update
            return Response(res.data)
        else:
            return Response(res.errors)
            
    #删除出版社
    def delete(self,request,pk):
        models.Publish.objects.filter(pk=pk).delete()
        return Response("")
View Code

 

二 mixin类和generice类

封装了每个接口相似的序列化代码,将相似的序列化代码抽取出来写在了继承的类里面。

对应源码配置参数:
queryset=models.Publish.objects.all()  #指定queryset对象 和对应的serializer类
serializer_class=PublishSerializers

路由:路由中有名分组的名字必须指定为pk

url(r'^publish/$', views.PublishView.as_view()),
url(r'^publish/(?P<pk>\d+)/$', views.PublishDetailView.as_view()),

视图:

from rest_framework.mixins import CreateModelMixin,RetrieveModelMixin,ListModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.generics import GenericAPIView
class PublishView(ListModelMixin,CreateModelMixin,GenericAPIView):
    queryset=models.Publish.objects.all()
    serializer_class=PublishSerializers

    def get(self, request):        #对应ListModelMixin类
        return self.list(request)

    def post(self, request):       #对应CreateModelMixin类
        return self.create(request)

class PublishDetailView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
    queryset=models.Publish.objects.all()
    serializer_class=PublishSerializers
    
    def get(self,request,*args,**kwargs):               #对应RetrieveModelMixin类
        return self.retrieve(request,*args,**kwargs)
        
    def put(self,request,*args,**kwargs):               #对应UpdateModelMixin类
        return self.update(request,*args,**kwargs)
        
    def delete(self,request,*args,**kwargs):            #对应DestroyModelMixin类
        return self.destroy(request,*args,**kwargs)
View Code

 

三:ListCreateAPIView和RetrieveUpdateDestroyAPIView类

进一步的封装,将get、post、get、put、delete这五个接口写在了继承的类里面

路由:路由中有名分组的名字必须指定为pk

url(r'^publish/$', views.PublishView.as_view()),
url(r'^publish/(?P<pk>\d+)/$', views.PublishDetailView.as_view()),

视图:

from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
class PublishView(ListCreateAPIView):
    #ListCreateAPIView类里包含get和post接口
    queryset=models.Publish.objects.all()
    serializer_class=PublishSerializers

class PublishDetailView(RetrieveUpdateDestroyAPIView):
    #RetrieveUpdateDestroyAPIView类里包含get、put、delete接口
    queryset=models.Publish.objects.all()
    serializer_class=PublishSerializers
View Code

 

四:ModelViewSet类

更进一步的封装,视图层的类继承ModelViewSet,通过路由的分发自动响应到ModelViewSet类里对应的五个接口中的一个

路由:路由中有名分组的名字必须指定为pk

url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)/$',views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),

视图:

from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):
    #ModelViewSet类里囊括了get、post、get、put、delete这五个接口
    queryset=models.Publish.objects.all()
    serializer_class=PublishSerializers

 

五:ViewSetMixin类分析

ModelViewSet类继承了ViewSetMixin类,所以可以通过路由响应到不同的函数

ViewSetMixin源码分析:

重写as_view()方法,可以给as_view()传参

 

posted on 2018-12-17 15:08  叶杨森  阅读(129)  评论(0编辑  收藏  举报