目录
一、视图集ViewSet知识点
1.1 视图集viewSets介绍
1.2 视图集viewSet分析
二、例子
2.1 需求
2.2 分析
2.3 代码
2.4 执行效果
前篇说明 普通视图generics及例子,这篇开始视图集学习。
Django REST framework允许你将一组相关视图的逻辑组合在单个类(称为 ViewSet)中。 在其他框架中,你也可以找到概念上类似于 'Resources' 或 'Controllers'的类似实现。
ps:简单来说就是自动帮你生成一套基于restful api风格的 http方法:
get:用到查询 post:用于创建 put:全部更新 patch:局部更新 delete:删除单条数据
形如以下方式:
def list(self, request): pass def create(self, request): pass def retrieve(self, request, pk=None): pass def update(self, request, pk=None): pass def partial_update(self, request, pk=None): pass def destroy(self, request, pk=None): pass
ViewSet 只是一种基于类的视图,它不提供任何方法处理程序(如 .get()或.post()),而是提供诸如 .list() 和 .create() 之类的操作。
ViewSet 的方法处理程序仅使用 .as_view() 方法绑定到完成视图的相应操作。
通常不是在 urlconf 中的视图集中显示注册视图,而是要使用路由类注册视图集,该类会自动为你确定 urlconf。
在pyCharm ide中按ctrl+n键盘,输入 viewsets
发现它的代码如下:
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
上面的几种方法分别对应http方法如下表所示:
minxins类名 使用方法 对应的http方法 CreateModelMixin .create(request, *args, **kwargs) post RetrieveModelMixin .retrieve(request, *args, **kwargs get UpdateModelMixin .update(request, *args, **kwargs)
.partial_update(request, *args, **kwargs)
put(全部更新)
patch(局部是新)
DestroyModelMixin .destroy(request, *args, **kwargs)
delete ListModelMixin .list(request, *args, **kwargs) get
得知它是通用视图集GenericViewSet+mixins的组合,所以它的写法和通用视图是一样的,
查看GenericViewSet类发现源代码如下:
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
说明了就是一堆通用视图generics+mixins 组合!!所以通用视图的方法在视图集一样是通用的。
只不过视图集比通视视图做得事更多,帮你写好更多的代码,让你省了不少事。
使用视图集viewSets通过学号查学生成绩。
我是在前篇代码的基础上直接进行修改了,把通常视图修改为视图集的形式。
使用视图集与通用视图不同的是使用了路由router类,先是路由类与视图集进行关联,再把路由的urls属性添加到urls的path路径中即可。视图集viewSets包含的范围比通常视图generics更广。
app/views.py代码修改如下:
from django.http import HttpResponse
from rest_framework import viewsets
from app.models import Stu
from app.serializers import StudentSerializer
# 主页,普通的django代码
def index(request):
return HttpResponse("hello django")
# 使用drf通用视图,queryset和serializer_class属性不能少
class StuViewSet(viewsets.ModelViewSet):
queryset = Stu.objects.all()
serializer_class = StudentSerializer
# 默认是pk主键,我修改为sid字段
lookup_field = 'sid'
app/urls.py代码如下:
from django.urls import path, include
from rest_framework import routers
from app import views
# router来注册我们的viewset
router = routers.DefaultRouter()
router.register(r'stu', views.StuViewSet)
urlpatterns = [
# 主页url映射
path('', views.index, name="index"),
# 配置通用视图映射
# 把路由的url包含进去,这样就做到了路径与函数的映射
path('', include(router.urls))
]
路由router:用一个router来注册我们的viewset,让urlconf自动生成get、post、put、patch、delete等方法并做好路径和映射。
lookup_field:用于执行各个model实例的对象查找的model字段。默认为 'pk'。 请注意,在使用超链接API时,如果需要使用自定义的值,你需要确保在API视图和序列化类都设置查找字段。
配置完上面之后会自动生成如下url及所支持的http方法
http://127.0.0.1/stu/
GET提交: 表示查询学号为sid的学生信息
http://127.0.0.1/stu/ POST提交:表示 新增学生
http://127.0.0.1/stu/PUT提交: 表示修改学号为sid的学生全部信息(全部更新)
http://127.0.0.1/stu/PATCH提交:表示修改学号为sid的学生部分信息(局部更新)
http://127.0.0.1/stu/DELETE提交:表示删除学号为sid的学生信息 http://127.0.0.1/stu/ OPTIONS提交:表示查看此地址所支持的方法
注:上面中的pk为主键,这里的是app_stu表的id字段
运行django,打开浏览器,先输入 http://127.0.0.1:8000/stu/ 看一下,发现列出全部学生
为了测试是是不是sid,我把sid为001的改为s001
测试一下通过学号访问,浏览器地址写成 http://127.0.0.1:8000/stu/s001/
我把上面的s001改为主键盘1,看一下行不,发现没找到,说明pk修改为sid是成功的。