python Django Rest_Framework框架 两个视图基类详解(图文并茂版)

视图基类

APIView[基本视图类]

  • APIView是所有DRF视图类的基类,在前面的文章我们已经简单的介绍过了,python Django Rest_Framework框架 APIView介绍与序列化器详解(图文并茂版)
  • 继承APIView实现的视图函数,所有对数据的操作都需要自己完成,使用上是不方便的,下面会介绍几种将数据操作封装起来的视图类,可以根据业务需求来选择最合适的视图类
  • 基本所有的视图类都可以实现业务需求,只是方便与不方便的选择!!

GenericAPIView[通用视图类]

  • 通用视图类主要作用就是把视图中的特别操作抽取出来,让视图中的方法更加通用,方便对通用操作进行简写
  1. 特别操作: 指的是不同方法中不能公用的操作,需要抽离出来,单独处理
  2. 通用操作: 指的是不同方法中可以公用的操作,保留即可
  • 继承于APIView基本视图类,主要增加了序列化器操作和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可与一个或多个Mixin扩展类一起使用
关于序列化器的属性与方法
get_serializer_class(self)
  • get_serializer_class(self): 当出现一个视图类中需要调用多个序列化器时,那么可以通过判断,get_serializer_class方法返回的不同的序列化器类名,使视图方法执行不同的序列化器对象
  • 返回值:所有需要调用的序列化器类,默认返回serializer_class,可以重写
get_serializer(self, *args, **kwargs)
  • get_serializer(self, *args, **kwargs):主要用来提供给Mixin扩展类使用,如果在视图中想要获取序列化器对象,可以直接调用此方法
  • 返回值:序列化器对象
注意

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

  • request:当前视图的请求对象
  • view:当前请求的类视图对象
  • format:当前请求期望返回的数据格式
get_queryset(self)
  • 主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写
  • 返回值:对应操作模型的查询集
get_object(self)
  • 主要用来提供给Mixin扩展类使用,在视图中可以调用该方法获取详情信息的模型类对象
  • 返回值:详情视图所需的模型类数据对象
其它属性
  • pagination_class 指明分页控制类
  • filter_backends 指明过滤控制类
定义与实现
  • 使用GenericAPIView[通用视图类] 作为视图基类,实现对定义的学生模型数据的增删查改操作:
from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import Students
from .serilizers import StudentsSerializers, StudentModelSerializers

class StudentGenericAPIView(GenericAPIView):
    """通用视图类:多个数据操作"""
    # 独特操作
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request):
        # 获取查询到的模型数据集
        ser = StudentModelSerializers(instance=self.get_queryset(), many=True)
        return Response(ser.data, status=status.HTTP_200_OK)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        # raise_exception:自动将报错信息返回给页面
        ser.is_valid(raise_exception=True)
        ser.save()

        return Response(ser.data, status=status.HTTP_201_CREATED)


class StudentDetailGenericAPIView(GenericAPIView):
    """通用视图类:单个数据操作"""
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request, pk):
        # 根据pk值,自动获取对应的模型对象
        ser = StudentsSerializers(instance=self.get_object())
        return Response(ser.data, status=status.HTTP_200_OK)

    def put(self, request, pk):
        ser = StudentModelSerializers(instance=self.get_object(), data=request.data)
        ser.is_valid(raise_exception=True)
        ser.save()
        return Response(ser.data, status=status.HTTP_201_CREATED)

    def delete(self, request, pk):
        self.get_object().delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

  • 全部数据查询展示:
    在这里插入图片描述
  • 数据全部展示,并且在添加数据时,有不同的方法可供选择(表单、json…)
  • 添加数据:
    在这里插入图片描述
  • 返回页面:
    在这里插入图片描述
  • 再次查询所有数据:
    在这里插入图片描述
  • 单个学生信息的查询:
    在这里插入图片描述
  • 单个学生信息的修改:
    在这里插入图片描述
  • 返回页面
    在这里插入图片描述
  • 删除某个学生信息
    在这里插入图片描述
  • 返回页面
    在这里插入图片描述
  • 查询所有数据看是否删除成功:
    在这里插入图片描述
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值