首页 > 其他分享 >4-04视图集ViewSet

4-04视图集ViewSet

时间:2023-08-03 11:36:51浏览次数:30  
标签:04 get BookInfoViewSet books 图集 action ViewSet serializer view


视图集ViewSet

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。如:

class BookInfoViewSet(viewsets.ViewSet):

    def list(self, request):
        books = BookInfo.objects.all()
        serializer = BookInfoSerializer(books, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        try:
            books = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = BookInfoSerializer(books)
        return Response(serializer.data)

在设置路由时,我们可以如下操作

urlpatterns = [
    url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
    url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]

常用视图集父类

1) ViewSet

继承自APIViewViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

2)GenericViewSet

使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView

GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIViewViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。

举例:

from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

url的定义

urlpatterns = [
    url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
    url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
]

3)ModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4)ReadOnlyModelViewSet

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

视图集中定义附加action动作

在视图集中,除了上述默认的方法动作外,还可以添加自定义动作。

举例:

from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def latest(self, request):
        """
        返回最新的图书信息
        """
        book = BookInfo.objects.latest('id')
        serializer = self.get_serializer(book)
        return Response(serializer.data)

    def read(self, request, pk):
        """
        修改图书的阅读量数据
        """
        book = self.get_object()
        book.bread = request.data.get('read')
        book.save()
        serializer = self.get_serializer(book)
        return Response(serializer.data)

url的定义

urlpatterns = [
    url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
    url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
    url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
    url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
]

action属性

在视图集中,我们可以通过action对象属性来获取当前请求视图集时的action动作是哪个。

例如:

from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
from booktest.models import BookInfo
from .serializers import BookInfoModelSerializer
from rest_framework.response import Response
class BookInfoModelViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    def get_top_5(self,request):
        """获取评论值最多的5条数据"""
        # 操作数据库
        print(self.action) # 获取本次请求的视图方法名
        
        
通过路由访问到当前方法中.可以看到本次的action就是请求的方法名

标签:04,get,BookInfoViewSet,books,图集,action,ViewSet,serializer,view
From: https://www.cnblogs.com/shclbear/p/17602821.html

相关文章

  • 题解 ARC104F
    前言在这里首先感谢一下题解区的FZzzz,本人的题解思路主要是基于他并给出了自己的理解。如非特殊说明,本题解中的数学符号原则上与题目中一致。题目分析需要转化的喵喵题。我们需要把原问题转化成一个图论计数问题,然后剩下的就很好办了。好,首先让我们修改一下题目的要求,将不......
  • 04_llvm_IR测试生成运算指令
    四则运算指令介绍如下:#include<vector>#include"llvm/IR/Module.h"#include"llvm/IR/LLVMContext.h"#include"llvm/Support/raw_ostream.h"#include"llvm/IR/Function.h"#include"llvm/IR/Verifier.h"#include......
  • seaborn的详解-线性关系04
    线性关系可视化许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,我们之前介绍了可以绘制双变量分布的函数。然而,使用统计模型来估计两个噪声观测组之间的简单关系可能是非常有帮助的。我们在这一章中讨论的函数功能将在线性回归的框架实现。 请注意,seabor......
  • ubuntu20.04 的 jetson设备命令行设置静态ip
    参考:https://github.com/f1tenth/f1tenth_doc/blob/stable/getting_started/software_setup/optional_software_nx.rst查看网口设备ifconfig#查看ip地址nmclid#查看网口设备nmclicshow#展示网口设备对应的名字修改eth0的ipsudonmclicmodWired\co......
  • Educational Codeforces Round 104
    https://codeforces.com/contest/1487A.Arena统计与最小值不同的数字数量。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintM=(1<<15)-1;voidsolve(){intn;cin>>n;vector<int>a(n);for(......
  • 振弦传感器信号转换器(VTI104_DIN)应用岩土工程监测
    振弦传感器信号转换器(VTI104_DIN)应用岩土工程监测振弦传感器信号转换器(VTI104_DIN)是一种用于实现振弦传感器信号转换的设备,可将振弦传感器所采集到的振动信号转换成电信号,并通过模拟量输出或数字量输出的方式进行传输和记录。在岩土工程监测中,振弦传感器信号转换器广泛应用于地震......
  • 工程监测仪器振弦传感器信号转换器(VTI104_DIN)
    工程监测仪器振弦传感器信号转换器(VTI104_DIN)振弦传感器信号转换器,简称VTI104_DIN,是一种用于转换振弦传感器信号的电子设备。该设备可以将振弦传感器产生的模拟信号转换成标准的电压或电流输出,从而使其可以连接到PLC、DCS、PC等控制系统中,实现自动控制、数据采集和处理等功能。......
  • .Net Web API 004 Controller获取对象列表,传入数据以及对象
    1、返回UserEntityList这个服务接口的目的是分为用户列表,代码如下所示。///<summary>///得到用户列表///</summary>///<returns></returns>[HttpGet][Route("GetUserList")]publicActionResult<List<UserEntity>>GetUserList(){varmyUse......
  • ubuntu16.04编译安装nginx1.24.0
    环境:DistributorID: UbuntuDescription: Ubuntu16.04.7LTSRelease: 16.04Codename: xenial 安装包:pcre-8.45.tar.gznginx-1.24.0.tar.gz开始安装:安装pcretar-xzvfpcre-8.45.tar.gzcdpcre-8.45./configure--prefix=/usr/local/pcremake&&makeinstall......
  • 提供高达400MHz性能ADBF704WCCPZ411、ADBF705WCBCZ411嵌入式处理器(DSP)
    这些器件是ADSP-BF70xBlackfin数字信号处理器(DSP)产品系列中的一员。新款Blackfin+处理器内核将16位双MAC、32位MAC和16位复杂MAC结合为先进的信号处理引擎。它还将干净且正交的RISC式微处理器指令集的优势和单指令、多数据流(SIMD)多媒体能力结合为一个指令集架构。而且Blac......