加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

django framework插件类视图方法

发布时间:2020-12-20 10:15:36 所属栏目:Python 来源:网络整理
导读:1.使用类视图APIView重写API 类视图APIView,取代@api_view装饰器,代码如下: from rest_framework import statusfrom rest_framework.response import Responsefrom rest_framework.views import APIViewfrom snippets.models import Snippetfrom snippets

1.使用类视图APIView重写API
类视图APIView,取代@api_view装饰器,代码如下:

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

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


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

    def post(self,request):
        data = request.data
        serializer = SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data,status=status.HTTP_201_CREATED)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)


class SnippetDetail(APIView):
    def get_object(self,pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Exception as e:
            pass

    def get(self,request,pk):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    def put(self,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,pk):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

2.编辑urls.py

from django.conf.urls import url,include
from django.contrib import admin

from snippets import views

urlpatterns = [
    url(r'^snippets/$',views.SnippetList.as_view()),url(r'^snippets/(?P<pk>[0-9]+)/$',views.SnippetDetail.as_view()),url(r'^admin/',admin.site.urls),url(r'^api-auth/',include('rest_framework.urls',namespace='rest_framework'))

]
APIView视图类,调用as_view()方法

3.使用Mixins
Mixins封装了增删改查的操作,因此可以使用Mixins简化代码,如下:

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import mixins,generics

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


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

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

    def post(self,**kwargs):
        return self.create(request,**kwargs)


class SnippetDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,**kwargs):
        return self.retrieve(request,**kwargs)

    def put(self,**kwargs):
        return self.update(request,**kwargs)

    def delete(self,**kwargs):
        return self.destroy(request,**kwargs)
SnippetList继承了mixins的ListModelMixin和CreateModelMixin类,赋值queryset,serializer_class属性,

然后定义了get,post方法,分别调用mixins的list,create函数。SnippetDetail定义类似。

4.使用通用类视图generics
rest_framework定义了可能的增删改查组合,优化了多重继承的繁杂

from rest_framework import generics

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


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


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

使用generics的ListCreateAPIView和RetrieveUpdateDestroyAPIView替代mixins类同时,去掉了get,post方法

5.使用viewsets进一步简化
viewsets包含了对一个model的增删改查全部操作,代码如下:

from rest_framework import viewsets

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


class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读