首页 > 其他分享 >视图组件

视图组件

时间:2023-06-09 09:23:56浏览次数:38  
标签:ser get self 视图 book 组件 class

视图继承关系

 

两个视图基类

  APIView

# from rest_framework.views import APIView

APIView是REST framework提供的所有视图的基类,继承自Django的view父类

 APIView与View的不同之处:

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

 APIView支持定义的类属性:

  • authentication_classes 列表或元祖,身份认证类
  • permissoin_classes 列表或元祖,权限检查类
  • throttle_classes 列表或元祖,流量控制类

 基于APIView写的五种接口

class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=5,decimal_places=2)
    publish=models.CharField(max_length=32)
models.py
from rest_framework import serializers
from app01.models import Book
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
ser.py
from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^books/(?P<pk>\d)', views.BookAPIView.as_view()),
    path('books/', views.BooksAPIView.as_view())
]
urls.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.ser import BookSerializer
from app01.models import Book

class BookAPIView(APIView):
    def get(self,request,pk):
        book = Book.objects.filter(id=pk).first()
        book_ser = BookSerializer(instance=book)
        return Response(book_ser.data)
    def put(self,request,pk):
        book = Book.objects.filter(id=pk).first()
        book_ser = BookSerializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'message':'修改失败'})
    def delete(self,request,pk):
        Book.objects.filter(id=pk).delete()
        return Response({'status':100,'message':'删除成功'})


class BooksAPIView(APIView):
    def get(self,request):
        books = Book.objects.all()
        books_ser = BookSerializer(instance=books,many=True)
        return Response(books_ser.data)
    def post(self,request):
        book_ser = BookSerializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'message':'添加失败'})
views.py

  GenericAPIView[通用视图类]

# from rest_framework.generics import GenericAPIView

 

继承自APIView,主要增加了操作序列化器和数据库查询的方法,作用是为Mixin扩展类的执行提供方法支持。通常在使用时,可以搭配一个或多个Mixin扩展类。

  GenericAPIView提供的关于序列化器使用的属性和方法

 提供的关于序列化器使用的属性与方法

  • 属性:

    • serializer_class 指明视图使用的序列化器
  • 方法:

    • get_serializer_class(self)

      当出现一个视图类中调用多个序列化器时,那么可以通过条件判断在get_serializer_class方法中通过返回不同的序列化器类名就可以让视图方法执行不同的序列化器对象了。

      返回序列化器类,默认返回serializer_class,可以重写,例如:

      def get_serializer_class(self):
          if self.request.user.is_staff:
              return FullAccountSerializer
          return BasicAccountSerializer
      
    • get_serializer(self, *args, **kwargs)

      返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。

      注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

      • request 当前视图的请求对象
      • view 当前请求的类视图对象
      • format 当前请求期望返回的数据格式

 提供的关于数据库查询的属性与方法

  • 属性:

    • queryset 指明使用的数据查询集
  • 方法:

    • get_queryset(self)

      返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

      def get_queryset(self):
          user = self.request.user
          return user.accounts.all()
      
    • get_object(self)

      返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。

      在试图中可以调用该方法获取详情信息的模型类对象。

      若详情访问的模型类对象不存在,会返回404。

      该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

      举例:

      # url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
      class BookDetailView(GenericAPIView):
          queryset = BookInfo.objects.all()
          serializer_class = BookInfoSerializer
      
          def get(self, request, pk):
              book = self.get_object() # get_object()方法根据pk参数查找queryset中的数据对象
              serializer = self.get_serializer(book)
              return Response(serializer.data)
      

 其他可以设置的属性

  • pagination_class 指明分页控制类
  • filter_backends 指明过滤控制后端

  基于GenericAPIView写的五种接口

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)
    publish = models.CharField(max_length=32)
models.py
from rest_framework import serializers
from app01.models import Book
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
ser.py
from django.contrib import admin
from django.urls import path,re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^books2/(?P<pk>\d)', views.BookGenericAPIView.as_view()),
    path('books2/', views.BooksGenericAPIView.as_view()),
]
urls.py
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from app01.ser import BookSerializer
from app01.models import Book

class BookGenericAPIView(GenericAPIView):
    # queryset  要传入queryset对象,需要查询的模型类
    # serilaizer_class  使用那个序列化器来序列化这堆数据
    # queryset = Book.objects.all()
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self,request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)
    def put(self,request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'message':'修改失败'})
    def delete(self,request,pk):
        ret = self.get_object().delete()
        return Response({'status':100,'message':'删除成功'})


class BooksGenericAPIView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self,request):
        book = self.get_queryset()
        books_ser = self.get_serializer(instance=book,many=True)
        return Response(books_ser.data)
    def post(self,request):
        book_ser = self.get_serializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'message':'添加失败'})
views.py

 

标签:ser,get,self,视图,book,组件,class
From: https://www.cnblogs.com/yuanxiaojiang/p/17468202.html

相关文章

  • React - 02 React的工程化/组件化开发
    我们可以基于webpack自己去搭建一套工程化打包的架子,但是这样非常的麻烦/复杂;React官方,为我们提供了一个脚手架:create-react-app!!脚手架:基于它创建项目,默认就把webpack的打包规则已经处理好了,把一些项目需要的基本文件也都创建好了!!1.create-react-app基础运用安装脚手架$npmicrea......
  • VUE | Element组件库的 el-collapse 标签的用法
    Collapse折叠面板:通过折叠面板收纳内容区域。1.基础用法可以折叠展开多个面板,面板之间互不影响。示例代码<el-collapsev-model="activeNames"@change="handleChange"><el-collapse-itemtitle="一致性Consistency"name="1"><div>与现实生活......
  • vue之动态组件&插槽
    1.动态组件<!--<component:is="who"></component>--><!--component标签的is属性等于组件名字,这里就会显示这个组件--><!--keep-alive的使用:可以将组件缓存,后期切过来时资源不会被销毁--><!--动态组件start--><divid="trends"><button@click=&......
  • Vue组件和Vue实例的理解
    关于VueComponent:1、组件本质是一个名为VueComponent的构造函数,并且不是程序员定义的,是Vue.extend生成的2、我们只需要写组件引入<Demo/>,Vue解析时会帮我们创建demo组件的实例对象,即Vue帮我执行的:new VueComponent(options)3、特别注意:每次调用Vue.extend,返回的都是一个全......
  • 组件扫描配置
    有时候我们并不需要扫描包下所有的注解,即有时我们只需要扫描特定的注解时,我们可以自己组件扫描配置。首先关闭默认的过滤器。<context:component-scanbase-package="包路径"use-default-filters="false">然后指定要扫描的注解。<context:include-filter......
  • 深入了解 HTTP 请求和响应、表单处理和验证、URL 路由和重定向、Web 服务和 API 开发,
    在Web开发中,了解HTTP请求和响应、表单处理和验证、URL路由和重定向、Web服务和API开发,以及PHP模板引擎和视图是非常重要的。本文将深入探讨这些概念,并提供相关的代码示例。1.HTTP请求和响应HTTP(超文本传输协议)是用于在客户端和服务器之间传输数据的协议。在Web开发中......
  • 组件之间的数据共享
    组件之间的数据共享组件之间的关系:最常见:父子关系;兄弟关系关于传递传递对象的引用在Vue的组件中,使用props传递数据时,对于对象类型的属性,实际上是传递对象的引用。在给子组件<son>传递user属性时,如果userinfo是一个对象,那么传递的是该对象的引用,而不是对象的副本......
  • Vue组件
    目录一组件介绍1.1组件是什么?有什么作用1.2组件的分类二组件的定义方式2.1定义全局组件2.2定义局部组件2.3总结三组件间通信3.1父传子属性验证3.2子传父3.3ref属性(也可以实现组件间通信:子和父都可以实现通信)1.ref属性放在普通标签上2.ref属性放在组件上四动态组件4.1......
  • 动态组件,插槽,vue-cli创建项目,目录结构,编写规范,导入导出语法
    1动态组件#<component:is="who"></component>#component标签的is属性等于组件名字,这里就会显示这个组件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>......
  • vue封装组件并发布到Npm
    前言vue封装组件是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用,甚至我们可以直接从npm仓库下载别人封装好的组件使用,入element-ui这一类的组件库。1、环境准备因为我们此次封装的是Vue组件,所以我们直接在Vue脚手架项目里面进行封装即可。(1)、初始化项目vuec......