RESTframwork之视图view
一 在view.py 中:
class AuthorView(APIView):
def get(self, request):
author_list = Author.objects.all() # 方式1: Django的序列化组件
# ret=serialize("json",publish_list)
# 方式2:rest的序列化
As = AuthorSerializers(author_list, many=True)
# 序列化数据 return Response(As.data) def post(self, request): # 添加一条数据
print(request.data) As = AuthorSerializers(data=request.data)
if As.is_valid():
As.save() # 生成记录
return Response(As.data)
else: return Response(As.errors) class AuthorDetailView(APIView):
def get(self, request, pk):
author_obj = Author.objects.filter(pk=pk).first()
As = AuthorSerializers(author_obj, many=False) return Response(As.data) def put(self, request, pk):
author_obj = Author.objects.filter(pk=pk).first()
print(request.data,author_obj)
# 结果为:{'name': '莫言1', 'age': 88, 'authorDetail': 2} 周围
As = AuthorSerializers(data=request.data, instance=author_obj)
if As.is_valid():
As.save() # update
return Response(As.data)
else:
return Response(As.errors) def delete(self, request, pk):
Author.objects.filter(pk=pk).delete() return Response("")
mixin类编写视图:
初步封装方法:如果按照这种方式,我们每个类都需要重复写大量的代码:所以为了解决这个问题,我们对类进行封装。
from rest_framework import mixins
from rest_framework import generics class BookView(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView): queryset = Book.objects.all()
serializer_class = BookSerializers 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 BookDetailView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers 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)
进一步封装:
通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py
模块。
from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin
from rest_framework import generics class AuthorView(generics.ListCreateAPIView):
'''
因为ListCreateAPIView继承了:
class ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView)
''' queryset=Author.objects.all
serializer_class=AuthorSerializers class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
'''
因为继承了:class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView)
'''
queryset = Author.objects.all
serializer_class = AuthorSerializers
终极封装:
from rest_framework.viewsets import ModelViewSet
'''
我们可以看下ModelViewSet中源码的解释:
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
提供了create()`, `retrieve()`, `update()`, `partial_update()`, `destroy()` and `list()`
这样六种方法。
''' class AuthorModelView(ModelViewSet): queryset=Author.objects.all()
serializer_class=AuthorSerializers
关于终极封装我们需要知道:
我们首先看url中传入的参数,这个时候我们为了区分两种GET请求,那么我们需要在as_view()中传值,初始化的时候就会执行as_view()方法,返回一个view方法。
当请求来的时候会执行view函数,执行到dispatch的时候发现执行不下去了,这个时候我们只能去APIView中去找到我们的dispatch方法。那么这里为什么去APIView中去执行
dispatch方法呢:
APIView(View) GenericAPIView(views.APIView) 这个类中没有dispatch方法。 ViewSet(ViewSetMixin, views.APIView):
那么我们整个ViewSet最关键的就是这么三行代码:
for method, action in actions.items():
handler = getattr(self, action)
setattr(self, method, handler)
执行完这三行代码,我们的GET对应的方法就变成了list,POST变成CREATE方法。
RESTframwork之视图view的更多相关文章
- day 94 RestFramework序列化组件与视图view
一 .复习 1. CBV流程 class BookView(View): def get(): pass def post(): pass #url(r'^books/', views.BookVie ...
- 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法
这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...
- SQL Server 索引(index) 和 视图(view) 的简单介绍和操作
--索引(index)和视图(view)-- --索引(index)----概述: 数据库中的索引类似于书籍的目录,他以指针形式包含了表中一列或几列组合的新顺序,实现表中数据库的逻辑排序.索引创建在数 ...
- UIViewController的生命周期(根视图view从无到有的过程)
UIViewController的生命周期实质上是指根视图view从无到有的过程 1.首先新建一个工程:不从mainstoryBoard加载 (删除入口) 在AppDelegate.m --> ...
- 视图(View)与部分视图(Partial View)之间数据传递
写ASP.NET MVC程序,我们经常需要把数据从视图(View)传递至部分视图(Partial View) 或者相反. 今天Insus.NET使用 ControllerBase.TempData 进 ...
- MVC中视图View向控制器传值的方法
MVC中视图View向控制器传值的方法步骤如下: 1.index页面: 页面中只需要一个触发事件的按钮
- Oracle 学习笔记 11 -- 视图 (VIEW)
本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...
- Android编程动态创建视图View的方法
在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layout ...
- 关于Android界面编程与视图(View)组件
UI组件--------------->android.widget.* View组件------------->android.view.* 视图(View)组件 所有UI组件都是建立在 ...
随机推荐
- gevent原理
未看 http://blog.csdn.net/yueguanghaidao/article/details/24281751
- MongoDB从3.0.6升级到MongoDB3.4.9
最初进入公司的时候,有些爬虫数据需要存储在mongo数据库里面,当时看到最新的数据库版本是3.0.6,现在公司开展了新的项目需要使用到Mongo,使用到了Mongo的一些表关联查询的方法,但是只有在最 ...
- LOJ 3055 「HNOI2019」JOJO—— kmp自动机+主席树
题目:https://loj.ac/problem/3055 先写了暴力.本来想的是 n<=300 的那个在树上暴力维护好整个字符串, x=1 的那个用主席树维护好字符串和 nxt 数组.但 x ...
- centos下cmake编译安装mysql5.7.24
一.centos6.5推荐最小安装.自定义添加如图两个包 二.安装cmake3.0(mysql5.7要求cmake2.9以上.cmake3.1要求gcc g++4.8以上.所以选自3.0) 1.分别执 ...
- C#:匿名类型
匿名类型和var关键字是Visual C# 3.0提供的一个新特性,var是隐式类型而并不是类型javascript中的var. var user = new { Id = 1, Name = &qu ...
- Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》(6)
Vivado HLS初识---阅读<vivado design suite tutorial-high-level synthesis>(6) 1.创建工程与开启GUI 2.调试 查看关于 ...
- javascript map forEach filter some every在购物车中的实战演练区分用法
1.map forEach 1.map 循环遍历每一项,返回一个新的数组 例: 购物车商品小计: //购物车 var cart=[ {"id":101,"name&quo ...
- Python标示符和关键字
标示符 什么是标示符,看下图: 标识符就是开发人员在程序中自定义的一些符号和名称. 标示符是自己定义的,如变量名 .函数名等. 标示符的规则 标示符由字母.下划线和数字组成,且数字不能开头 pytho ...
- .net core 连接sql server 时提示Connection Timeout Expired
.net core开发环境是ubuntu LINUX, 在ubuntu 上 telnet 数据库IP 端口是通的. SQL SERVER 是2008 ,未打SP补丁. 打完 SQL SERVER 2 ...
- mac打开文件提示文件已经坏了的修改
10.12下面,mac做了安全的限制,不能打开任意的文件,需要解除限制 sudo spctl --master-disable