视图

一、进化

class GenericView(APIView):
"""把视图中可能用到的配置和方法封装起来"""
queryset = None
serializer_class = None def get_queryset(self):
# 让每次请求来的时候都现查一次数据
return self.queryset.all()

混合类的巧妙使用:

# python mixin(混合类):不能单独使用,和其它类搭配起来使用(利用了Python支持多继承)
class ListMixin(object):
def get(self, request):
queryset = self.get_queryset()
ser_obj = self.serializer_class(queryset, many=True)
return Response(ser_obj.data)

二、超进化

提取混合类,将混合类继续组合!

把增删改查查五哥动作拆分出来,写成独立的混合类。

# python mixin(混合类):不能单独使用,和其它类搭配起来使用(利用了Python支持多继承)
class ListMixin(object):
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
ser_obj = self.serializer_class(queryset, many=True)
return Response(ser_obj.data) class CreateMixin(object):
def create(self, request, *args, **kwargs):
ser_obj = self.serializer_class(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response("ok")
else:
return Response(ser_obj.errors) # 获取具体某一条记录
class RetrieveMixin(object):
def retrieve(self, request, pk, *args, **kwargs):
obj = self.get_object(request, pk, *args, **kwargs)
if obj:
# 2. 将书籍对象 序列化成 json格式的数据
ser_obj = self.serializer_class(obj)
# 3. 返回响应
return Response(ser_obj.data)
else:
return Response("无效的id") class UpdateMixin(object):
def update(self, request, pk, *args, **kwargs):
obj = self.get_object(request, pk, *args, **kwargs)
if obj:
ser_obj = self.serializer_class(instance=obj, data=request.data, partial=True) # form组件中也有类似的实现
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
else:
return Response(ser_obj.errors)
else:
return Response("无效的id") class DestroyMixin(object):
def destroy(self, request, pk, *args, **kwargs):
obj = self.get_object(request, pk, *args, **kwargs)
if obj:
obj.delete()
return Response("删除成功")
else:
return Response("无效的id")

具体的视图:

# 作者
class AuthorListView(GenericView, ListMixin, CreateMixin):
queryset = models.Author.objects.all()
serializer_class = AuthorModelSerializer class AuthorDetailView(RetrieveView, UpdateMixin, DestroyMixin):
queryset = models.Author.objects.all()
serializer_class = AuthorModelSerializer

其实内置已经提供了

from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

三、究极进化

一张表要写两个视图,定义两次 queryset和serializer_class 重复!

from rest_framework.viewsets import GenericViewSet

重写了as_view()方法,实现了根据请求的方法执行具体的类方法

路由注册的时候,利用actions参数,实现路由的定向分发 而不是简单的 反射

url(r'authors/$', views.AuthorViewSet.as_view(actions={'get': 'list', 'post': 'create'})),  # 作者列表
url(r'authors/(?P<pk>\d+)/$', views.AuthorViewSet.as_view(
actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})
), # 作者详情

路由都重复写两条:

还可以利用内置的DefaultRouter来实现路由的注册

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('authors', views.AuthorViewSet) urlpatterns += router.urls

四、总结

Restful API学习Day3 - DRF视图的更多相关文章

  1. Restful API学习Day4 - DRF版本控制和认证

    参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...

  2. Restful API学习Day5 - DRF之限制 分页 解析器和渲染器

    参考文档: Django REST framework基础:认证.权限.限制 Django REST framework基础:分页 Django REST framework基础:解析器和渲染器 一. ...

  3. RESTful API 学习

    /********************************************************************************* * RESTful API 学习 ...

  4. RESTful API学习Day2 - Django REST framework

    Django REST framework 参考文档: 官方文档:官方文档 中文文档:中文文档 一.是什么? 基于Django开发RESTful API的一个框架 为什么要用它? 补充: ​ CBV的 ...

  5. RESTful API学习与实践

    参考文献: 1.Learn About ASP.NET Web API 2.深入浅出REST 3.Infoq上“深入探索REST”系列文章 4.RESTful API设计的一点经验 5.Angular ...

  6. RESTful API 学习【第1篇】

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  7. Restful API学习笔记

    之前关于这个概念在网上看了一些,看完似懂非懂,模模糊糊,发现专业术语或者说书面表达的形式对于理解这种十分抽象的概念还是低效了点. 书面文档方面看了以下几个: 理解本真的REST架构风格 1. 要深入理 ...

  8. Spring Boot 2.x 编写 RESTful API (六) 事务

    用Spring Boot编写RESTful API 学习笔记 Transactional 判定顺序 propagation isolation 脏读 不可重复读 幻读 不可重复读是指记录不同 (upd ...

  9. Spring Boot 2.x 编写 RESTful API (五) 单元测试

    用Spring Boot编写RESTful API 学习笔记 概念 驱动模块 被测模块 桩模块 替代尚未开发完毕的子模块 替代对环境依赖较大的子模块 (例如数据访问层) 示例 测试 Service @ ...

随机推荐

  1. MySQL数据库的基本使用简单易懂

    MySQL数据库的基本使用 一.数据库概述 1. 基本介绍 数据库就是以一定格式进行组织的数据的集合.通俗来看数据库就是用户计算机上 一些具有特殊格式的数据文件的集合 2. 数据库的特点 持久化存储 ...

  2. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  3. WebClient请求接口,get和post方法

    1,get方式 string URI = "url"; //实例化 WebClient client = new WebClient(); // client.UseDefault ...

  4. MVC控制器传递多个实体类集合到视图的方案总结

    MVC控制器向视图传递数据包含多个实体类的解决方案有很多,这里主要针对视图模型.动态模型以及Tuple三种方法进行一些总结与记录. 基础集合类:TableA namespace ViewModelSt ...

  5. django 通过邮箱和用户名都能登录

    一. 在settings.py 文件中的#Application definition 下增加代码: AUTHENTICATION_BACKENDS=( 'users.views.CustomBack ...

  6. 3.git 分支操作

    1.git branch 查看分支 git branch -a  查看远程仓库分支 结果显示,只有一个master分支,项目刚开始默认只有一个分支,名字叫做master,一般都不会直接在master上 ...

  7. Ubuntu17安装Chrome有效

    http://blog.csdn.net/NFMSR/article/details/78348000 1.进入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终 ...

  8. awk 处理文本:行转列,列转行

    [root@centos ~]# cat f 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 51 2 3 4 5 awk '{for(i=1;i<=NF;i++)a ...

  9. oracle数据泵导入导出命令

    1.在PL/SQL的界面,找到Directories文件夹,找到目录文件的路径 2.通过SSH进入服务器 找到相应的路径 cd /u01/oracle/dpdir 输入指令 df -h   查看资源使 ...

  10. vscode Live Server使用

    vscode 的Live Server插件可以开启本地服务器