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

Posted 温柔且上进c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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…)
  • 添加数据:
  • 返回页面:
  • 再次查询所有数据:
  • 单个学生信息的查询:
  • 单个学生信息的修改:
  • 返回页面
  • 删除某个学生信息
  • 返回页面
  • 查询所有数据看是否删除成功:

以上是关于python Django Rest_Framework框架 两个视图基类详解(图文并茂版)的主要内容,如果未能解决你的问题,请参考以下文章

python django怎么读

python的django工程可以用tomcat发布吗

python django能开发大型网站吗

python 中 django 的问题-------- 请高人指点 尽量详细点哦 初学django

Python-Django框架学习笔记——第二课:Django的搭建

如何在python文件中,引用django1.10的model