DRF教程4-视图集和路由类
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-视图集和路由类的更多相关文章
- DRF教程3-类视图
Rewriting our API using class-based views 使用类视图重写root views,只需要一点点重构. from django.http import Http40 ...
- DRF 视图和路由
Django Rest Feamework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个 ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
- DRF介绍,DRF项目开发,DRF项目的视图类的dispatch源码解析
目录 一.DRF介绍 1. 什么是DRF 2. 为什么要用DRF (1)使用DRF的原因 (2)站在开发者的角度来说用DRF的好处(暂时列举这么多) 二.用DRF开发后端项目 三.APIView请求生 ...
- 0014 基于DRF框架开发(02 基类视图 GenericAPIView)
前端于对数据操作的请求基本上就分为四类:增删改查,即增加.删除.修改.查询. 而DRF把前端请求分为两个大类:带ID参数请求和不带ID参数请求. 不带ID参数请求包括:增加.分布多条查询 带ID参数请 ...
- DRF 的视图,路由和渲染器
DRF 的视图,路由和渲染器 1 视图 简单的增删改查 : ModelViewSet; 复杂的操作使用APIView 和 GenericViewSet APIView(View) class Home ...
- Django框架的使用教程--视图和路由[二]
视图和路由 1.创建一个django_test应用 2.setting中设置django_test INSTALLED_APPS = [ 'django.contrib.admin', 'django ...
- drf 教程
1, 序列化 Serialization 创建一个新环境 在做其他事之前,我们会用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在工作的其他项目完全隔离. virtualenv ...
- Django REST framework基础:视图和路由
DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...
随机推荐
- Block浅析一
1.在Block结构体中含有isa指针,这就证明了Block其实就是对象,并具有一般对象的所有功能. 2.Block是OC中的一种数据类型,在iOS开发中被广泛使用. 3.block的应用 (1)遍历 ...
- poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合
题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- wait()和notify()
从https://www.cnblogs.com/toov5/p/9837373.html 可以看到他的打印是一片一片的,这边博客介绍怎么避免掉 使用notify 和 wait的时候 要注意 是在sy ...
- 关于Javascript中声明变量、函数的笔记
一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1, ...
- Vue父子组件间的通信
父组件通过 props 向下传递数据给子组件,子组件通过 events 向上给父组件发送消息. 父组件: <div> <div style="background:#344 ...
- P2383 狗哥玩木棒
题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第一行是一个整数n表示测试 ...
- ietester
ietest 最好安装在默认的C 装在其他的地方会报错
- JAVA 内部类 (三)实例
为什么要用内部类:控制框架 一个“应用程序框架”是指一个或一系列类,它们专门设计用来解决特定类型的问题.为应用应用程序框架,我们可从一个或多个类继承,并覆盖其中的部分方法.我们在覆盖方法中编写的代码用 ...
- AI—家庭组机器人平台环境配置,高级人工智能实验总结
首先说一下我的环境:Ubuntu 12.04 32bit, gcc 4.6.3 一,安装boost 1.48,建议用这个版本的,不然会出现兼容性问题 步骤: 其实在ubuntu下,可以用一下命令直接 ...
- 甩掉 ashx/asmx,使用jQuery.ajaxWebService请求WebMethod,Ajax处理更加简练
在WebForm下 开发ajax程序,需要借助于一般处理程序(*.ashx)或web服务(*.asmx),并且每一个ajax请求,都要建一个这样的文件,如此一来,如果在一个项目中ajax程序多了,势必 ...