rest框架包括一个处理viewset的抽象,允许开发人员集中精力处理api交互和建模,url构造都根据常见方式自动处理。

ViewSet类 几乎和VIew类一样,不过它提供read,update这样的操作,而不是get,put。

Refactoring to use ViewSets

现在来重构之前的view代码。首先把CourseList和CourseDetail重构为一个简单的CourseViewSet。

from rest_framework import viewsets

from .models import Course
from .serializer import CourseSerializer class CourseViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Course.objects.all()
serializer_class = CourseSerializer
#继承自ModelViewSet类,就是说已经自带了视图集的五个action
#就是说向外暴露了五个操作接口

  

有时候只需要 提供只读信息,那么就只能list和retrieve,就需要只读接口

from rest_framework import viewsets

from .models import UserProfile
from .serializer import UserProfileSerializer class UserProfileViewSet(viewsets.ReadOnlyModelViewSet):
"""
retrieve : return a user info
list: return all the user info
"""
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
#只向外暴露retrieve和list接口

  

自定义接口

ModelViewSet提供了全部接口,ReadOnlyModelViewSet提供了list和get接口,

接口肯定要把不必要的接口类型禁用,比如delete。

如果需要delete之外的全部接口,就需要重写视图类

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
"""
The GenericViewSet class does not provide any actions by default,
but does include the base set of generic view behavior, such as
the `get_object` and `get_queryset` methods.
"""
pass class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass 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.
"""
pass
#阅读viewsets的源码,可知本质就是把mixins的几个子类引入进来
#不同接口引入不同的类

  

#先引入相关类
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet class GameGroupViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
retrieve:
返回指定信息
list:
返回列表
update:
更新信息
partial_update:
更新部分字段
"""
queryset = GameGroup.objects.all()
serializer_class = GameGroupSerializer
#重写视图类

  

重写get_queryset

在视图类中,queryset属性一般就是model.objects.all(),但很多情况下是要对数据进行筛选修改的,所以就需要重新

class SvrFormalViewSet(viewsets.ReadOnlyModelViewSet):
"""
retrieve:
返回指定信息
list:
返回列表
""" serializer_class = SvrSerializer def get_queryset(self): q = ~Q(sid__in = [5000,5012,5020]) #去掉测试区
appids = [] _appids = list(Svrconfig.objects.filter(q).values('id')) #嵌套字典的列表
for appid in _appids: #转化appid的列表
appids.append(appid['id']) details = Svr.objects.filter(appid__in = appids) return details
#得到的查询集不再all(),而是修改过的details

  

Binding ViewSets to URLs explicitly

viewset只是带进了一组action,比如list,create等。

在url中,把http方法绑定到相关的动作上。请求get,就路由到list,请求post action,就请求道create action。

courseList = views.CourseViewSet.as_view({
"get": "list",
"post": "create"
}) courseDetail = views.CourseViewSet.as_view({
"get": "retrieve",
"put": "update",
"delete": "destroy"
}) urlpatterns = [
path('admin/', xadmin.site.urls),
path('course/', courseList,name='course_list'),
path('course/<int:pk>/', courseDetail ,name='course_detail'),
]
urlpatterns = format_suffix_patterns(urlpatterns)

  

Using Routers

使用routers,需要做的是使用路由器注册适当的视图集,而其余的资源连接可以使用Router类自动处理。

可见,course资源相关的,只需要一个url,其他router会自动处理。

可选参数,base_name:   用来生成urls名字,如果viewset中没有包含queryset, base_name一定要有

from django.urls import path,include
from rest_framework.routers import DefaultRouter
from courses.views import CourseViewSet
import xadmin router = DefaultRouter()
router.register('course', CourseViewSet,base_name='course') urlpatterns = [
path('admin/', xadmin.site.urls),
path('', include(router.urls)),
]
#不再需要在app里创建urls文件,只需要在项目目录下将资源的视图集注册到router。

  

DRF教程4-视图集和路由类的更多相关文章

  1. DRF教程3-类视图

    Rewriting our API using class-based views 使用类视图重写root views,只需要一点点重构. from django.http import Http40 ...

  2. DRF 视图和路由

    Django Rest Feamework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个 ...

  3. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  4. DRF介绍,DRF项目开发,DRF项目的视图类的dispatch源码解析

    目录 一.DRF介绍 1. 什么是DRF 2. 为什么要用DRF (1)使用DRF的原因 (2)站在开发者的角度来说用DRF的好处(暂时列举这么多) 二.用DRF开发后端项目 三.APIView请求生 ...

  5. 0014 基于DRF框架开发(02 基类视图 GenericAPIView)

    前端于对数据操作的请求基本上就分为四类:增删改查,即增加.删除.修改.查询. 而DRF把前端请求分为两个大类:带ID参数请求和不带ID参数请求. 不带ID参数请求包括:增加.分布多条查询 带ID参数请 ...

  6. DRF 的视图,路由和渲染器

    DRF 的视图,路由和渲染器 1 视图 简单的增删改查 : ModelViewSet; 复杂的操作使用APIView 和 GenericViewSet APIView(View) class Home ...

  7. Django框架的使用教程--视图和路由[二]

    视图和路由 1.创建一个django_test应用 2.setting中设置django_test INSTALLED_APPS = [ 'django.contrib.admin', 'django ...

  8. drf 教程

    1, 序列化 Serialization 创建一个新环境 在做其他事之前,我们会用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在工作的其他项目完全隔离. virtualenv ...

  9. Django REST framework基础:视图和路由

    DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...

随机推荐

  1. Mac端博客发布工具推荐

    引子 推荐一款好用的 Mac 端博客发布工具. 下载地址 echo 博客对接 这里以cnblog为例.接入类型为metawebblog,access point可以在cnblog的设置最下边找到,然后 ...

  2. GIN+GORILLA=A GOLANG WEBSOCKET SERVER

    鉴于聊天已然成为大部分app的基础功能,而大部分app用户基数有没有辣么大,常用的聊天server架构如xmpp或者消息队列实现之类的用起来还挺麻烦的,有比较难跟网页端做交互,加之H5标准落地,所以w ...

  3. 在 Linux 上如何清除内存的 Cache、Buffer 和交换空间

    原文链接:http://www.linuxidc.com/Linux/2015-06/118856.htm 像任何其他的操作系统一样,GNU/Linux 已经实现的内存管理不仅有效,而且更好.但是,如 ...

  4. OSI和TCP/IP

    OSI和TCP/IP 1.        OSI的七层网络结构(功能及特点) 1)  物理层:为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特.此外,该层中还具有确定连接设备的 ...

  5. 关于Froala Editor的简单使用

    1.添加样式表 <!-- 核心样式表 --> <link rel="stylesheet" href="${ctx}/resources/froala_ ...

  6. nyoj 1030 hihocoder 1338

    题目链接1: 点这里打开. 题目链接2:   点击打开链接 思路:dp,dp[i][j] 表示某个人在区间 i,j上的得分. sum数组表示前 n 项和, num 数组用来存输入的数字. 因为取数字是 ...

  7. 谈谈javaScript

    谈谈javaScript  (杰我学习) 一. 什么是JavaScript       人们通常所说的JavaScript,其正式名称为ECMAScript.这个标准由ECMA组织发展和维护.ECMA ...

  8. Hihocder 1639 : 图书馆 (组合数+唯一分解 求最后一位)(妙)

    给定n,(n<=10^3),然后输入n的数a[i],(a[i]<=1e10),求ans=(a1+a2+a3...an)! / (a1!*a2!*a3!...an!) 的结果的最一位数. 适 ...

  9. hibernate VS mybatis

    1: 一般来说,业务逻辑比较简单,集增删改查就可以满足需求,建议使用hibernate,而复杂的业务逻辑,尤其是多表关联查询,建议使用mybatis. 2: hibernate有更好的二级缓存机制,可 ...

  10. PowerDesigner:导出SQL脚本以及问题解决

    在PowerDesigner中点击DataBase  -----------> Generate Datebase  -----(可以点击Preview预览sql语句)------->设置 ...