基础视图

示例环境搭建:新建一个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()

最新文章

  1. add-two-numbers
  2. 【Tomcat 6.0官方文档翻译】—— 简介
  3. 【HTML5】拖放(Drag 和 drop)
  4. ExtJs之Ext.form.field.ComboBox组合框
  5. 【原创】Git版本控制器的基本使用
  6. jQuery的基本语法
  7. Java 重写hashCode 方法和equals方法
  8. Gitbucket—快速建立自己的Github
  9. 20. Web proxies (网页代理 4个)
  10. HDFS简述
  11. HTML中的锚点设置和table格式
  12. Market Guide for AIOps Platforms
  13. 集群瓶颈为什么是磁盘io
  14. ABAP知识点提纲
  15. linux列出一个目录及其子目录下面的某种类型的文件
  16. 自己制作winhex的模板
  17. koa2学习笔记03 - 给koa2配置session ——koa2结构分层、配置数据库、接口
  18. 在apache环境中使用 python stock 请求遇到error: [Errno 13] Permission denied
  19. IIS站点/虚拟目录中访问共享目录(UNC)以及建立后的应用程序的信任级别问题
  20. Percona Xtrabackup 安装

热门文章

  1. S1_搭建分布式OpenStack集群_05 glance安装配置
  2. BZOJ 3166: [Heoi2013]Alo 链表+可持久化trie
  3. WinDbg常用命令系列---显示局部变量dv
  4. C# DataTable转换为Html
  5. SP19997 MOON2 - Moon Safari (Hard) 【数论,多项式】
  6. JDK 下载相关资料
  7. sublime 添加到右键菜单
  8. 读入优化&amp;输出优化
  9. mingw w64的下载地址
  10. compass和paoding分词器的基本使用