Django框架之DRF 基于mixins来封装的视图详解
基础视图
示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由、视图函数、序列化单独创建py文件
#配置路由 fromdjango.conf.urlsimporturl fromdjango.contribimportadmin fromapp01importviews urlpatterns=[ url(r'^admin/',admin.site.urls), url(r'^PublishView/',views.PublishView.as_view()), url(r'^PublishDetailView/(?P\d+)',views.PublishDetailView.as_view()), ]
#视图: fromdjango.shortcutsimportrender fromrest_framework.viewsimportAPIView fromapp01importmodels fromapp01.MySerimportBookSer,PublishSer,AuthorSer fromrest_framework.responseimportResponse #Createyourviewshere. #基本视图 classPublishView(APIView): defget(self,request): publish_list=models.Publish.objects.all() bs=PublishSer(publish_list,many=True) returnResponse(bs.data) defpost(self,request): bs=PublishSer(data=request.data) ifbs.is_valid(): bs.save() returnResponse(bs.data) else: returnResponse(bs.errors) classPublishDetailView(APIView): defget(self,request,pk): publish_obj=models.Publish.objects.filter(pk=pk).first() bs=PublishSer(publish_obj,many=False) returnResponse(bs.data) defput(self,request,pk): publish_obj=models.Publish.objects.filter(pk=pk).first() bs=PublishSer(data=request.data,instance=publish_obj) ifbs.is_valid(): bs.save() returnResponse(bs.data) else: returnResponse(bs.data) defdelete(self,request,pk): models.Publish.objects.filter(pk=pk).delete() returnResponse("")
#MySer.py fromrest_frameworkimportserializers fromapp01importmodels classBookSer(serializers.ModelSerializer): classMeta: model=models.Book fields='__all__' classPublishSer(serializers.ModelSerializer): classMeta: model=models.Publish fields='__all__' classAuthorSer(serializers.ModelSerializer): classMeta: model=models.Author fields='__all__'
基于mixins来封装的视图
其它不变,更改视图:
#基于mixins来封装的视图 fromrest_framework.mixinsimportCreateModelMixin,\ ListModelMixin,\ RetrieveModelMixin,\ DestroyModelMixin,\ UpdateModelMixin fromrest_framework.genericsimportGenericAPIView classPublishView(CreateModelMixin,ListModelMixin,GenericAPIView): queryset=models.Publish.objects.all() serializer_class=PublishSer defget(self,request,*args,**kwargs): returnself.list(request,*args,**kwargs) defpost(self,request,*args,**kwargs): returnself.create(request,*args,**kwargs) classPublishDetailView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView): queryset=models.Publish.objects.all() serializer_class=PublishSer defget(self,request,*args,**kwargs): returnself.retrieve(request,*args,**kwargs) defput(self,request,*args,**kwargs): returnself.update(request,*args,**kwargs) defdelete(self,request,*args,**kwargs): returnself.destroy(request,*args,**kwargs)
可以看出视图类中还是有很多冗余代码
mixins封装再封装,第三种方法
#第三种写法: fromrest_framework.genericsimportCreateAPIView,\ ListCreateAPIView,\ DestroyAPIView,\ RetrieveUpdateDestroyAPIView classPublishView(ListCreateAPIView): queryset=models.Publish.objects.all() serializer_class=PublishSer classPublishDetailView(RetrieveUpdateDestroyAPIView): queryset=models.Publish.objects.all() serializer_class=PublishSer
还是有冗余代码
第四种写法,再次封装,全部写在一个类中
#路由 fromdjango.conf.urlsimporturl fromdjango.contribimportadmin fromapp01importviews urlpatterns=[ url(r'^admin/',admin.site.urls), url(r'^publish/$',views.PublishView.as_view({'get':'list','post':'create'})), url(r'^publish/(?P\d+)$',views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'})), ]
#第四种写法:5个接口写在一个类中 fromrest_framework.viewsetsimportModelViewSet classPublishView(ModelViewSet): queryset=models.Publish.objects.all() serializer_class=PublishSer
补充:
fromrest_framework.viewsetsimportViewSetMixin fromrest_framework.viewsimportAPIView #ViewSetMixin重写了as_view方法 classTest(ViewSetMixin,APIView): defaaa(self,request): returnResponse()
以上这篇Django框架之DRF基于mixins来封装的视图详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。