基础视图
示例环境搭建:新建一个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()
以上这篇Django框架之DRF 基于mixins来封装的视图详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。