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. Safair浏览器 时间戳转化兼容性问题。

    chrome 等浏览器支持 yyyy-MM-dd hh:mm:ss 格式,使用 Date.parse()进行转化 safair 浏览器不知道这种格式,需要将格式设置为 yyyy/MM/dd hh:mm ...

  2. HackerRank leonardo-and-lucky-numbers —— 模线性方程的通解

    题目链接:https://vjudge.net/problem/HackerRank-leonardo-and-lucky-numbers 题解: 1.根据扩展欧几里得:7*x + 4*y = gcd ...

  3. (转)Java经典设计模式(2):七大结构型模式(附实例和详解)

    原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式 ...

  4. Chapter 3 Shared Assemblies and Strongly Named Assemblies

    As time marches on,MS developers and control developer modify their code:they fix bugs,patch securit ...

  5. liunx目录/etc下相关配置

    这些都是比较有实用性的系统配置,收藏下,以备不时之需!以下是etc下重要配置文件解释: 1./etc/hosts  #文件格式: IPaddress hostname aliases #文件功能: 提 ...

  6. xen添加网卡

    brctl addbr xenbr0 ifconfig xenbr0 up ifconfig xenbr0 192.168.0.1 /etc/xen/scripts/network-bridge st ...

  7. bzoj5117

    线段树 先看前三个操作,都是区间修改,我们对于信息维护一个二元组(a,b),表示x=max(x+a,b),那么第一个操作就是(a,-inf),第二个是(-a,0),第三个是(-inf,a) 然后看查询 ...

  8. force

    题意 求解 Ei = Fi/qi 解法: 方法一: 考虑左侧的式子,直接多项式乘法. 对于右面的式子,我们记做$B_j$,这样有 $$B_j = \sum_{j<i}{ revq_{n-i} f ...

  9. java.endorsed.dirs

    java.ext.dirs 用于扩展jdk的系统库,那么 -Djava.endorsed.dirs 又有什么神奇的作用呢? java提供了endorsed技术: 关于endorsed:可以的简单理解为 ...

  10. 网络编程-TCP连接-readLine

    Server: package com.net.tcp; import java.io.BufferedReader; import java.io.IOException; import java. ...