zoukankan      html  css  js  c++  java
  • Django框架之DRF 基于mixins来封装的视图

    基础视图

    示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由、视图函数、序列化单独创建py文件

    # 配置路由
    
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^PublishView/', views.PublishView.as_view()),
        url(r'^PublishDetailView/(?P<pk>d+)', views.PublishDetailView.as_view()),
    
    ]
    # 视图:
    
    from django.shortcuts import render
    from rest_framework.views import APIView
    from app01 import models
    from app01.MySer import BookSer,PublishSer,AuthorSer
    from rest_framework.response import Response
    # Create your views here.
    # 基本视图
    
    class PublishView(APIView):
    
        def get(self,request):
            publish_list = models.Publish.objects.all()
            bs = PublishSer(publish_list, many=True)
            return Response(bs.data)
    
        def post(self, request):
            bs = PublishSer(data=request.data)
            if bs.is_valid():
                bs.save()
                return Response(bs.data)
            else:
                return Response(bs.errors)
    
    class PublishDetailView(APIView):
        def get(self, request, pk):
            publish_obj = models.Publish.objects.filter(pk=pk).first()
            bs = PublishSer(publish_obj, many=False)
            return Response(bs.data)
    
        def put(self, request, pk):
            publish_obj = models.Publish.objects.filter(pk=pk).first()
            bs = PublishSer(data=request.data, instance=publish_obj)
            if bs.is_valid():
                bs.save()
                return Response(bs.data)
            else:
                return Response(bs.data)
    
        def delete(self, request, pk):
            models.Publish.objects.filter(pk=pk).delete()
            return Response("")
    # MySer.py
    
    from rest_framework import serializers
    from app01 import models
    
    class BookSer(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            fields = '__all__'
    
    
    class PublishSer(serializers.ModelSerializer):
        class Meta:
            model = models.Publish
            fields = '__all__'
    
    
    class AuthorSer(serializers.ModelSerializer):
        class Meta:
            model = models.Author
            fields = '__all__'

    基于mixins来封装的视图

    其它不变,更改视图:

    # 基于mixins来封装的视图
    from rest_framework.mixins import CreateModelMixin,
                                      ListModelMixin,
                                      RetrieveModelMixin,
                                      DestroyModelMixin,
                                      UpdateModelMixin
    from rest_framework.generics import GenericAPIView
    
    class PublishView(CreateModelMixin, ListModelMixin, GenericAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = PublishSer
        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 PublishDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = PublishSer
        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)

    可以看出视图类中还是有很多冗余代码

    mixins封装再封装,第三种方法

    # 第三种写法:
    from rest_framework.generics import CreateAPIView,
                                        ListCreateAPIView,
                                        DestroyAPIView,
                                        RetrieveUpdateDestroyAPIView
    
    class PublishView(ListCreateAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = PublishSer
    
    class PublishDetailView(RetrieveUpdateDestroyAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = PublishSer

    还是有冗余代码

    第四种写法,再次封装,全部写在一个类中

    # 路由
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        url(r'^publish/$', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
        url(r'^publish/(?P<pk>d+)$', views.PublishView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    
    ]
    # 第四种写法:5个接口写在一个类中
    from rest_framework.viewsets import ModelViewSet
    class PublishView(ModelViewSet):
        queryset = models.Publish.objects.all()
        serializer_class = PublishSer

     补充:

    from rest_framework.viewsets import  ViewSetMixin
    from rest_framework.views import  APIView
    # ViewSetMixin 重写了as_view方法
    class Test(ViewSetMixin,APIView):
    
        def aaa(self,request):
            return Response()
  • 相关阅读:
    java(样品集成框架spring、spring mvc、spring data jpa、hibernate)
    设定十分钟android在状态栏上集成的开源project推荐
    分析javascript关闭
    排列-条件求和(Code)
    Leetcode: Remove Duplicates from Sorted Array
    怎样将baidu地图中的baidu logo 去掉
    Android自适应不同屏幕几种方法
    浏览器兼容性问题解决方式
    XMPP入门
    “聊天剽窃手”--ptrace进程注入型病毒
  • 原文地址:https://www.cnblogs.com/suguangti/p/11134504.html
Copyright © 2011-2022 走看看