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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Django REST framework 视图

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django REST framework 视图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一部分代碼在序列化部分

類繼承順序

############### mixins.py ################ # 類中調用的方法均在 GenericAPIView 類中實現,所以下列類需要結合 GenericAPIView 使用 class ListModelMixin(object) # 查看繼承類def list(self, request, *args, **kwargs)class CreateModelMixin(object) # 添加繼承類def create(self, request, *args, **kwargsclass RetrieveModelMixin(object) # 查看單條繼承類def retrieve(self, request, *args, **kwargs)class UpdateModelMixin(object) # 更新單條繼承類def update(self, request, *args, **kwargs)class DestroyModelMixin(object) # 刪除單條繼承類def destroy(self, request, *args, **kwargs)############### generics.py ############### class GenericAPIView(views.APIView)pass # 這個是懶得寫,主要結合上邊的使用class ListCreateAPIView(mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView):def get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class RetrieveUpdateAPIView(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,GenericAPIView):def get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def patch(self, request, *args, **kwargs):return self.partial_update(request, *args, **kwargs) )############### viewsets.py ############### class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet)pass # 這個是真passclass GenericViewSet(ViewSetMixin, generics.GenericAPIView):pass # 這個也是真passclass ViewSetMixin(object):def as_view(cls, actions=None, **initkwargs)def view(request, *args, **kwargs):def initialize_request(self, request, *args, **kwargs):

?

?

不使用使用混合(mixins)

自己重構get,put等函數,全部手寫,代碼重復率很高:

from rest_framework.views import APIView from rest_framework.response import Response from .models import * from django.shortcuts import HttpResponse from django.core import serializers from rest_framework import serializersclass BookSerializers(serializers.ModelSerializer):class Meta:model=Bookfields="__all__"#depth=1class PublshSerializers(serializers.ModelSerializer):class Meta:model=Publishfields="__all__"depth=1class BookViewSet(APIView):def get(self,request,*args,**kwargs):book_list=Book.objects.all()# 文本類型,這個是和上面的連接有關,后面的參數context,HyperlinkedIdentityField,這個是設置了連接的時候,進行的操作bs=BookSerializers(book_list,many=True,context={'request': request}) return Response(bs.data)def post(self,request,*args,**kwargs):print(request.data)bs=BookSerializers(data=request.data,many=False)if bs.is_valid():print(bs.validated_data)bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)class BookDetailViewSet(APIView):def get(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,context={'request': request})return Response(bs.data)def put(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,data=request.data,context={'request': request})if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)class PublishViewSet(APIView):def get(self,request,*args,**kwargs):publish_list=Publish.objects.all()bs=PublshSerializers(publish_list,many=True,context={'request': request})return Response(bs.data)def post(self,request,*args,**kwargs):bs=PublshSerializers(data=request.data,many=False)if bs.is_valid():# print(bs.validated_data)bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)class PublishDetailViewSet(APIView):def get(self,request,pk):publish_obj=Publish.objects.filter(pk=pk).first()bs=PublshSerializers(publish_obj,context={'request': request})return Response(bs.data)def put(self,request,pk):publish_obj=Publish.objects.filter(pk=pk).first()bs=PublshSerializers(publish_obj,data=request.data,context={'request': request})if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

第一代:繼承mixin類編寫視圖

繼承mixins的ListModelMixin,CreateModelMixin等類

from rest_framework import mixins from rest_framework import genericsclass BookViewSet(mixins.ListModelMixin, # 查看繼承類mixins.CreateModelMixin, # 添加繼承類generics.GenericAPIView):queryset = Book.objects.all() # 數據庫serializer_class = BookSerializers # 序列化類def get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class BookDetailViewSet(mixins.RetrieveModelMixin, # 查看單條繼承類mixins.UpdateModelMixin, # 更新單條繼承類mixins.DestroyModelMixin, # 刪除單條繼承類generics.GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializersdef 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)

第二代:使用通用的基于類的視圖

通過使用mixin類,我們使用更少的代碼重寫了這些視圖,但我們還可以再進一步。REST框架提供了一組已經混合好(mixed-in)的通用視圖,我們可以使用它來簡化我們的views.py模塊。

from rest_framework import mixins from rest_framework import genericsclass BookViewSet(generics.ListCreateAPIView):queryset = Book.objects.all()serializer_class = BookSerializersclass BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):queryset = Book.objects.all()serializer_class = BookSerializersclass PublishViewSet(generics.ListCreateAPIView):queryset = Publish.objects.all()serializer_class = PublshSerializersclass PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):queryset = Publish.objects.all()serializer_class = PublshSerializers

第三代:viewsets.ModelViewSet

urls.py:

url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"), url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get': 'retrieve','put': 'update','patch': 'partial_update','delete': 'destroy'}),name="book_detail"),

views.py:?

class BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializers

終極版

urls.py同上

views.py

from rest_framework.routers import DefaultRouterrouter = DefaultRouter() # 實例化 router.register(r'school', views.SchoolView) # 注冊 urlpatterns += router.urls # 在urlpatterns中添加

?

總結

以上是生活随笔為你收集整理的Django REST framework 视图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。