码迷,mamicode.com
首页 > 其他好文 > 详细

视图组件

时间:2018-12-17 16:00:38      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:数据   str   http   ror   views   span   def   抽取   model   

一:基本视图

写一个出版社的增删查改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()传参

技术分享图片

 

视图组件

标签:数据   str   http   ror   views   span   def   抽取   model   

原文地址:https://www.cnblogs.com/yeyangsen/p/10131633.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!