一 在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的更多相关文章

  1. day 94 RestFramework序列化组件与视图view

    一 .复习 1. CBV流程 class BookView(View): def get(): pass def post(): pass #url(r'^books/', views.BookVie ...

  2. 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法

    这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...

  3. SQL Server 索引(index) 和 视图(view) 的简单介绍和操作

    --索引(index)和视图(view)-- --索引(index)----概述: 数据库中的索引类似于书籍的目录,他以指针形式包含了表中一列或几列组合的新顺序,实现表中数据库的逻辑排序.索引创建在数 ...

  4. UIViewController的生命周期(根视图view从无到有的过程)

    UIViewController的生命周期实质上是指根视图view从无到有的过程 1.首先新建一个工程:不从mainstoryBoard加载 (删除入口) 在AppDelegate.m --> ...

  5. 视图(View)与部分视图(Partial View)之间数据传递

    写ASP.NET MVC程序,我们经常需要把数据从视图(View)传递至部分视图(Partial View) 或者相反. 今天Insus.NET使用 ControllerBase.TempData 进 ...

  6. MVC中视图View向控制器传值的方法

    MVC中视图View向控制器传值的方法步骤如下: 1.index页面: 页面中只需要一个触发事件的按钮

  7. Oracle 学习笔记 11 -- 视图 (VIEW)

    本次必须学习一个全新的概念-- 视图 (VIEW).在前面的笔记中曾提到过,数据对象包含:表.视图.序列.索引和同义词.前面的笔记都是对表的想剖析,那么本次笔记就对视图的世界进行深入的剖析. 视图是通 ...

  8. Android编程动态创建视图View的方法

    在Android开 发中,在Activity中关联视图View是一般使用setContentView方法,该方法一种参数是使用XML资源直接创 建:setContentView (int layout ...

  9. 关于Android界面编程与视图(View)组件

    UI组件--------------->android.widget.* View组件------------->android.view.* 视图(View)组件 所有UI组件都是建立在 ...

随机推荐

  1. express 与 koa 区别

    express 与 koa 区别 区别项 express koa 中间件模型 Compress 模型 洋葱圈模型 对象个数 只有2个对象:Request 和 Response 有3个对象:Reques ...

  2. TypeScript 之 声明文件的发布

    https://www.tslang.cn/docs/handbook/declaration-files/publishing.html 发布声明文件到npm,有两种方式: 与你的npm包捆绑在一起 ...

  3. window.external的使用

    我们在js中可以通过window.external.myfunc()来调用浏览器提供的外部方法myfunc.可以让网页内的js脚本中能调用C++代码. window.external 是外部对象,如你 ...

  4. 十一、springboot(六)整合Thymeleaf

    1.添加jar包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...

  5. 【巷子】---react-redux---【react】

    一.Redux与组件 react-redux是一个第三方插件使我们在react上更方便的来使用redux这个数据架构 React-Redux提供connect方法,用于从UI组件生成容器组件,conn ...

  6. jenkins 邮件配置 二 ***

    Jenkins 有两种邮件通知方式: 1.Jenkins自带的“E-mail Notification” 2.插件:Extended E-mail Notification,是可编辑的邮件配置方式. ...

  7. Web Services and C# Enums

    Web Service Transparency .NET support for web services is excellent in creating illusion of transpar ...

  8. CAD求交点函数

    public void IntersectWith( Entity entityPointer, Intersect intersectType, Point3dCollection points, ...

  9. 两招解决异常_Cannot find any information on property 'XXX' in a bean of type 'XXX'的问题

    第一招 在进行Java Web项目开发的时候,我碰到过下面这个异常: Cannot find any information on property 'XXX' in a bean of type ' ...

  10. Java第09次实验(IO流)

    参考资料 本次作业参考文件 正则表达式参考资料 第1次实验 0. 验证 使用FileOutputStream写字节.(二进制文件与文本文件.try...catch...finally注意事项) 使用D ...