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


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

#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)post

 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)# 返回報錯信息url


到如今爲止還挺好。它看起來與前一種狀況很是類似,但咱們在不一樣的HTTP方法之間有了更好的分離。咱們還須要更新實例視圖views.py。rest

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

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

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

相關文章
相關標籤/搜索