经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django框架之DRF 基于mixins来封装的视图详解
来源:jb51  时间:2019/7/23 11:20:53  对本文有异议

基础视图

示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由、视图函数、序列化单独创建py文件

  1. # 配置路由
  2.  
  3. from django.conf.urls import url
  4. from django.contrib import admin
  5. from app01 import views
  6.  
  7. urlpatterns = [
  8. url(r'^admin/', admin.site.urls),
  9. url(r'^PublishView/', views.PublishView.as_view()),
  10. url(r'^PublishDetailView/(?P<pk>\d+)', views.PublishDetailView.as_view()),
  11.  
  12. ]
  1. # 视图:
  2.  
  3. from django.shortcuts import render
  4. from rest_framework.views import APIView
  5. from app01 import models
  6. from app01.MySer import BookSer,PublishSer,AuthorSer
  7. from rest_framework.response import Response
  8. # Create your views here.
  9. # 基本视图
  10.  
  11. class PublishView(APIView):
  12.  
  13. def get(self,request):
  14. publish_list = models.Publish.objects.all()
  15. bs = PublishSer(publish_list, many=True)
  16. return Response(bs.data)
  17.  
  18. def post(self, request):
  19. bs = PublishSer(data=request.data)
  20. if bs.is_valid():
  21. bs.save()
  22. return Response(bs.data)
  23. else:
  24. return Response(bs.errors)
  25.  
  26. class PublishDetailView(APIView):
  27. def get(self, request, pk):
  28. publish_obj = models.Publish.objects.filter(pk=pk).first()
  29. bs = PublishSer(publish_obj, many=False)
  30. return Response(bs.data)
  31.  
  32. def put(self, request, pk):
  33. publish_obj = models.Publish.objects.filter(pk=pk).first()
  34. bs = PublishSer(data=request.data, instance=publish_obj)
  35. if bs.is_valid():
  36. bs.save()
  37. return Response(bs.data)
  38. else:
  39. return Response(bs.data)
  40.  
  41. def delete(self, request, pk):
  42. models.Publish.objects.filter(pk=pk).delete()
  43. return Response("")
  1. # MySer.py
  2.  
  3. from rest_framework import serializers
  4. from app01 import models
  5.  
  6. class BookSer(serializers.ModelSerializer):
  7. class Meta:
  8. model = models.Book
  9. fields = '__all__'
  10.  
  11.  
  12. class PublishSer(serializers.ModelSerializer):
  13. class Meta:
  14. model = models.Publish
  15. fields = '__all__'
  16.  
  17.  
  18. class AuthorSer(serializers.ModelSerializer):
  19. class Meta:
  20. model = models.Author
  21. fields = '__all__'

基于mixins来封装的视图

其它不变,更改视图:

  1. # 基于mixins来封装的视图
  2. from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin
  3. from rest_framework.generics import GenericAPIView
  4.  
  5. class PublishView(CreateModelMixin, ListModelMixin, GenericAPIView):
  6. queryset = models.Publish.objects.all()
  7. serializer_class = PublishSer
  8. def get(self, request, *args, **kwargs):
  9. return self.list(request, *args, **kwargs)
  10.  
  11. def post(self, request, *args, **kwargs):
  12. return self.create(request, *args, **kwargs)
  13.  
  14. class PublishDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
  15. queryset = models.Publish.objects.all()
  16. serializer_class = PublishSer
  17. def get(self, request, *args, **kwargs):
  18. return self.retrieve(request, *args, **kwargs)
  19.  
  20. def put(self, request, *args, **kwargs):
  21. return self.update(request, *args, **kwargs)
  22.  
  23. def delete(self, request, *args, **kwargs):
  24. return self.destroy(request, *args, **kwargs)

可以看出视图类中还是有很多冗余代码

mixins封装再封装,第三种方法

  1. # 第三种写法:
  2. from rest_framework.generics import CreateAPIView, ListCreateAPIView, DestroyAPIView, RetrieveUpdateDestroyAPIView
  3.  
  4. class PublishView(ListCreateAPIView):
  5. queryset = models.Publish.objects.all()
  6. serializer_class = PublishSer
  7.  
  8. class PublishDetailView(RetrieveUpdateDestroyAPIView):
  9. queryset = models.Publish.objects.all()
  10. serializer_class = PublishSer

还是有冗余代码

第四种写法,再次封装,全部写在一个类中

  1. # 路由
  2. from django.conf.urls import url
  3. from django.contrib import admin
  4. from app01 import views
  5.  
  6. urlpatterns = [
  7. url(r'^admin/', admin.site.urls),
  8.  
  9. url(r'^publish/$', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
  10. url(r'^publish/(?P<pk>\d+)$', views.PublishView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
  11.  
  12. ]
  1. # 第四种写法:5个接口写在一个类中
  2. from rest_framework.viewsets import ModelViewSet
  3. class PublishView(ModelViewSet):
  4. queryset = models.Publish.objects.all()
  5. serializer_class = PublishSer

补充:

  1. from rest_framework.viewsets import ViewSetMixin
  2. from rest_framework.views import APIView
  3. # ViewSetMixin 重写了as_view方法
  4. class Test(ViewSetMixin,APIView):
  5.  
  6. def aaa(self,request):
  7. return Response()

以上这篇Django框架之DRF 基于mixins来封装的视图详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号