1. 程式人生 > >django的幾種方法進行序列化(視圖)

django的幾種方法進行序列化(視圖)

保持 支持 匹配 重寫 war 頁面 定義 混合 rgs


我們還可以使用基於類的視圖而不是基於函數的視圖來編寫API視圖。我們將看到這是一個強大的模式,允許我們重用常用功能,並幫助我們保持代碼。
使用基於類的視圖重寫我們的API
我們首先將根視圖重寫為基於類的視圖。所有這些涉及的重構views.py。

#1. 相關模塊

from .models import Snippet
from .serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

# 定義class類,於url路由要匹配

class SnippetList(APIView):
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)

def post(self, request, format=None):
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid():# 判斷並保存
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)# 返回http狀態碼信息
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)# 返回報錯信息


到現在為止還挺好。它看起來與前一種情況非常相似,但我們在不同的HTTP方法之間有了更好的分離。我們還需要更新實例視圖views.py。

class SnippetDetail(APIView):
# 獲取pk=id值,進行單條的查看,獲取,修改和刪除
def get_object(self, pk):
try: #如果此頁面不存在則返回404頁面不存在的一個異常處理
return Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
raise Http404

def get(self, request, pk): # 定義參數pk對應id值,指你要進行單條操作的一條數據
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet)
return Response(serializer.data)

def put(self, request, pk):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet, data=request.data)
if serializer.is_valid():# 判斷並保存
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, pk):
snippet = self.get_object(pk)
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
那看起來不錯。同樣,它現在仍然非常類似於基於功能的視圖。

我們還需要snippets/urls.py稍微重構一下,因為我們正在使用基於類的視圖。

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from demo import views

urlpatterns = [
path(‘snippets/‘, views.SnippetList.as_view()),
path(‘snippets/<int:pk>/‘, views.SnippetDetail.as_view()),# 根據視圖中匹配id
]

urlpatterns = format_suffix_patterns(urlpatterns)
好的,我們已經完成了。如果你運行開發服務器,一切都應該像以前一樣工作。

使用mixins
使用基於類的視圖的一大勝利是它允許我們輕松地編寫可重用的行為。

到目前為止,我們一直使用的創建/檢索/更新/刪除操作對於我們創建的任何模型支持的API視圖都非常相似。這些常見行為在REST框架的mixin類中實現。

讓我們看一下如何使用mixin類組合視圖。這是我們的views.py模塊。

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics

class SnippetList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
我們將花點時間仔細研究這裏發生了什麽。我們正在使用的建築我們的觀點GenericAPIView,並在加ListModelMixin和CreateModelMixin。

基類提供核心功能,mixin類提供.list()和.create()操作。然後我們將這些get和post方法明確地綁定到適當的操作上。到目前為止簡單的東西。

class SnippetDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

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 delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
很相似。同樣,我們正在使用的GenericAPIView類來提供核心功能,並混入增加提供.retrieve(),.update()和.destroy()行動。

使用基於類的通用視圖
使用mixin類,我們重寫了視圖,使用的代碼比以前略少,但我們可以更進一步。REST框架提供了一組已經混合的通用視圖,我們可以使用它來進一步減少我們的views.py模塊。

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics


class SnippetList(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

django的幾種方法進行序列化(視圖)