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()
  • 相关阅读:
    【带着canvas去流浪(5)】绘制K线图
    【带着canvas去流浪(4)】绘制散点图
    【带着canvas去流浪】 (3)绘制饼图
    Mybatis缓存(1)--------系统缓存及简单配置介绍
    this引用逃逸
    MySQL优化(1)--------常用的优化步骤
    Java的内存模型
    Java Generator
    深入理解Java重载与重写
    对象的自我救赎
  • 原文地址:https://www.cnblogs.com/suguangti/p/11134504.html
Copyright © 2011-2022 走看看