hualinux dj3 2.5:drf视图集ViewSets及例子

目录

一、视图集ViewSet知识点

1.1 视图集viewSets介绍

1.2 视图集viewSet分析

二、例子

2.1 需求

2.2 分析

2.3 代码

2.4 执行效果


 

前篇说明 普通视图generics及例子,这篇开始视图集学习。

一、视图集ViewSet知识点

1.1 视图集viewSets介绍

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。

1.2 视图集viewSet分析

在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, **kwargsget
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 组合!!所以通用视图的方法在视图集一样是通用的。

只不过视图集比通视视图做得事更多,帮你写好更多的代码,让你省了不少事。

 

二、例子

2.1 需求

使用视图集viewSets通过学号查学生成绩。

我是在前篇代码的基础上直接进行修改了,把通常视图修改为视图集的形式。

2.2 分析

使用视图集与通用视图不同的是使用了路由router类,先是路由类与视图集进行关联,再把路由的urls属性添加到urls的path路径中即可。视图集viewSets包含的范围比通常视图generics更广。

2.3 代码

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/<sid>      GET提交: 表示查询学号为sid的学生信息
http://127.0.0.1/stu/              POST提交:表示 新增学生
http://127.0.0.1/stu/<sid>      PUT提交: 表示修改学号为sid的学生全部信息(全部更新)
http://127.0.0.1/stu/<sid>      PATCH提交:表示修改学号为sid的学生部分信息(局部更新)
http://127.0.0.1/stu/<sid>      DELETE提交:表示删除学号为sid的学生信息

http://127.0.0.1/stu/             OPTIONS提交:表示查看此地址所支持的方法

注:上面中的pk为主键,这里的是app_stu表的id字段

2.4 执行效果

运行django,打开浏览器,先输入 http://127.0.0.1:8000/stu/ 看一下,发现列出全部学生

为了测试是是不是sid,我把sid为001的改为s001

测试一下通过学号访问,浏览器地址写成 http://127.0.0.1:8000/stu/s001/

我把上面的s001改为主键盘1,看一下行不,发现没找到,说明pk修改为sid是成功的。

​​​​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值