日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django框架之DRF 基于mixins来封装的视图

發(fā)布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django框架之DRF 基于mixins来封装的视图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

閱讀目錄

  • 基礎(chǔ)視圖
  • 基于mixins來封裝的視圖
  • mixins封裝再封裝,第三種方法
  • 第四種寫法,再次封裝,全部寫在一個類中

基礎(chǔ)視圖

示例環(huán)境搭建:新建一個Django項目,連接Mysql數(shù)據(jù)庫,配置路由、視圖函數(shù)、序列化單獨創(chuàng)建py文件

-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------# 配置路由from django.conf.urls import url from django.contrib import admin from app01 import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^PublishView/', views.PublishView.as_view()),url(r'^PublishDetailView/(?P<pk>\d+)', views.PublishDetailView.as_view()),] # 視圖:from django.shortcuts import render from rest_framework.views import APIView from app01 import models from app01.MySer import BookSer,PublishSer,AuthorSer from rest_framework.response import Response # Create your views here. # 基本視圖class PublishView(APIView):def get(self,request):publish_list = models.Publish.objects.all()bs = PublishSer(publish_list, many=True)return Response(bs.data)def post(self, request):bs = PublishSer(data=request.data)if bs.is_valid():bs.save()return Response(bs.data)else:return Response(bs.errors)class PublishDetailView(APIView):def get(self, request, pk):publish_obj = models.Publish.objects.filter(pk=pk).first()bs = PublishSer(publish_obj, many=False)return Response(bs.data)def put(self, request, pk):publish_obj = models.Publish.objects.filter(pk=pk).first()bs = PublishSer(data=request.data, instance=publish_obj)if bs.is_valid():bs.save()return Response(bs.data)else:return Response(bs.data)def delete(self, request, pk):models.Publish.objects.filter(pk=pk).delete()return Response("") # MySer.pyfrom rest_framework import serializers from app01 import modelsclass BookSer(serializers.ModelSerializer):class Meta:model = models.Bookfields = '__all__'class PublishSer(serializers.ModelSerializer):class Meta:model = models.Publishfields = '__all__'class AuthorSer(serializers.ModelSerializer):class Meta:model = models.Authorfields = '__all__'

基于mixins來封裝的視圖

其它不變,更改視圖:

# 基于mixins來封裝的視圖 from rest_framework.mixins import CreateModelMixin,\ListModelMixin,\RetrieveModelMixin,\DestroyModelMixin,\UpdateModelMixin from rest_framework.generics import GenericAPIViewclass PublishView(CreateModelMixin, ListModelMixin, GenericAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class PublishDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerdef 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)

可以看出視圖類中還是有很多冗余代碼

回到頂部

mixins封裝再封裝,第三種方法

# 第三種寫法: from rest_framework.generics import CreateAPIView,\ListCreateAPIView,\DestroyAPIView,\RetrieveUpdateDestroyAPIViewclass PublishView(ListCreateAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerclass PublishDetailView(RetrieveUpdateDestroyAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSer

還是有冗余代碼

回到頂部

第四種寫法,再次封裝,全部寫在一個類中

# 路由 from django.conf.urls import url from django.contrib import admin from app01 import viewsurlpatterns = [url(r'^admin/', admin.site.urls),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'})),] # 第四種寫法:5個接口寫在一個類中 from rest_framework.viewsets import ModelViewSet class PublishView(ModelViewSet):queryset = models.Publish.objects.all()serializer_class = PublishSer

補充:

from rest_framework.viewsets import ViewSetMixin from rest_framework.views import APIView # ViewSetMixin 重寫了as_view方法 class Test(ViewSetMixin,APIView):def aaa(self,request):return Response()

總結(jié)

以上是生活随笔為你收集整理的Django框架之DRF 基于mixins来封装的视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。