django rest framework我的学习笔记(五)————Tutorial3.Class-based Views

(官网地址)[django rest framework我的学习笔记(四)————Tutorial]python

Class-based views

咱们也可以使用class-based view 来编写咱们的API views,而不是基于function based views.正如咱们所看到的,这是一个强大的模式,它使咱们的功能可以复用,并保持咱们的代码整洁。django

使用class-based views重写咱们的API

咱们开始重写编写咱们的root views。这一切都只涉及修改一点views.py文件。post

from snippets.models import Snippet
from snippets.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 SnippetList(APIView):
"""
列出全部的snippet,或者建立一个新的snippet.
"""
    def get(self,request,format=None):
        snippet = 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)
        return Response(serializer.error,status=status.HTTP_400_BAD_REQUEST)

它看起来和以前的实例至关的相似,可是咱们更好的将不一样的HTTP请求分离了。
咱们也可以更新咱们的实例,在views.py文件中。学习

class SnippetDetail(APIView):
    """
    检索,更新或者删除一个snippet 实例。
    """
    def get_object(self,pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            return Hppt404
    
    
    def get(self,request,pk,format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)
        
    def put(self,request,pk,format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet,data=request.data)
        if serializer.is_valid():
            serlalizer.save()
            return Response(serializer.data)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
        
    def delete(self,request,pk,format=None)
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

咱们还须要为咱们的calss-based views添加url.url

from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

urlpatterns = [
    url(r'^snippets/$',views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+/$',views.SnippetDatail.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

Ok,咱们完成了。rest

mixins

大量使用class-based views的好处之一,能够让咱们轻易的组成可复用的组件。
咱们须要使用的操做就 建立/检索/更新/删除。这些常见的行为咱们能够使用REST framework 的 mixin classes。
接下来将展现使用mixin classes来组成咱们的views。咱们再一次来到views.py文件。code

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来构建咱们的view,并添加了ListModelMixinCreateModelMixin.
这个base class 包含了核心功能,mixin classes包含了.list().create()行为。咱们可以使用这些行为来构建getpost.orm

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)

使用generic class-based views

使用mixin classes来重写咱们的代码,比以前要稍微少写一些,可是咱们想更进一步。REST framework 提供了mixed-in generic views,咱们可以使用它来装饰咱们的views.ip

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

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

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = snippet.objects.all()
    serializer = SnippetSerializer
相关文章
相关标签/搜索