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()
  • 相关阅读:
    利用BootStrap Table插件实现自己的弹出框分页。
    spring+redis的集成,使用spring-data-redis来集成
    Postgresql/Greenplum中将数字转换为字符串TO_CHAR函数前面会多出一个空格
    将根据时间戳增量数据方案修改为根据批次号增量数据方案
    Postgresql查询出换行符和回车符:
    增量数据,如果下次增量数据存在重复数据,如何解决。
    creating server tcp listening socket 127.0.0.1:6379: bind No error
    echarts的地图点击事件
    Postman 安装及使用入门教程(我主要使用接口测试)
    HTML5 canvas 捕鱼达人游戏
  • 原文地址:https://www.cnblogs.com/suguangti/p/11134504.html
Copyright © 2011-2022 走看看