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