python Django Rest_Framework框架 五个视图扩展类详解(图文并茂版)

介绍

扩展类也叫混入类(Mixin)

作用:

  • 提供了对数据资源进行增删改查的五种后端视图,当需要做出的操作数据此五种,可以通过继承相应的扩展类来复用代码,减少自己编写的代码量

  • 这五个扩展类需要搭配GenericAPIView通用视图基类一起使用,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法

  • 下述操作的数据模型均为前面博客中的同一模型,python Django Rest_Framework框架 APIView介绍与序列化器详解(图文并茂版)

ListModelMixin(列表视图扩展类)

  • 列表视图扩展类,提供**list(request, *args, kwargs)方法快速实现列表视图,返回200状态码

  • 该Mixin的list方法可以对数据进行过滤和分页
    代码实现:

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.response import Response
from rest_framework.views import APIView

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


class StudentView(GenericAPIView, ListModelMixin):
    """ListModelMixin:展示全部数据"""
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request):
        return self.list(request)

路由:

from django.urls import path, re_path

from . import views

urlpatterns = [
    # 基出序列化器
    # 多数据操作
    path('students/', views.StudentsApiview.as_view()),
    # 单个数据进行操作
    re_path('students/(?P<pk>\d+)/', views.StudentDerailApiview.as_view()),

    # 模型序列化器
    path('students1/', views.Students1Apiview.as_view()),
    re_path('students1/(?P<pk>\d+)/', views.StudentDerail1Apiview.as_view()),

    # GenericAPIView[通用视图类]与模型序列化器
    path('students2/', views.StudentGenericAPIView.as_view()),
    re_path('students2/(?P<pk>\d+)/', views.StudentDetailGenericAPIView.as_view()),

    # GenericAPIView[通用视图类]与扩展类
    path('students3/', views.StudentView.as_view())
]

在这里插入图片描述

CreateModelMixin(创建视图扩展类)

  • 创建视图扩展类,提供**create(request, *args, kwargs)方法快速实现创建资源的视图,成功返回201状态码

  • 如果序列化器对前端发送的数据验证失败,返回400错误
    代码实现:

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.response import Response
from rest_framework.views import APIView

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


class StudentView(GenericAPIView, ListModelMixin, CreateModelMixin):
    """ListModelMixin:展示全部数据"""
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request):
        return self.list(request)

    def post(self, request):
        return self.create(request)

路由与上一个扩展类相同

在这里插入图片描述
在这里插入图片描述

RetrieveModelMixin(详情视图扩展类)

  • 详情视图扩展类,提供**retrieve(request, *args, kwargs)方法,可以快速实现返回一个存在的模型数据对象

  • 如果存在,返回200状态码, 否则返回404状态码
    代码实现:

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
from rest_framework.response import Response
from rest_framework.views import APIView

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


class StudentDetailView(GenericAPIView, RetrieveModelMixin):
    """RetrieveModelMixin:查看一个存在的数据对象
    """
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request, pk):
        return self.retrieve(request, pk)

路由文件:

# @Time: 2022/4/6-10:02
# @User: Ycx
from django.urls import path, re_path

from . import views

urlpatterns = [
    # 基出序列化器
    # 多数据操作
    path('students/', views.StudentsApiview.as_view()),
    # 单个数据进行操作
    re_path('students/(?P<pk>\d+)/', views.StudentDerailApiview.as_view()),

    # 模型序列化器
    path('students1/', views.Students1Apiview.as_view()),
    re_path('students1/(?P<pk>\d+)/', views.StudentDerail1Apiview.as_view()),

    # GenericAPIView[通用视图类]与模型序列化器
    path('students2/', views.StudentGenericAPIView.as_view()),
    re_path('students2/(?P<pk>\d+)/', views.StudentDetailGenericAPIView.as_view()),

    # GenericAPIView[通用视图类]与扩展类
    path('students3/', views.StudentView.as_view()),
    re_path('students3/(?P<pk>\d+)/', views.StudentDetailView.as_view()),

]

在这里插入图片描述

UpdateModelMixin(更新视图扩展类)

  • 更新视图扩展类,提供**update(request, *args, kwargs)方法,可以快速实现更新一个存在的数据对象

  • 同时也提供**partial_update(request, *args, kwargs)方法,可以实现局部更新

  • 成功返回200状态码,序列化器校验数据失败时,返回400错误状态码
    代码实现:

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
from rest_framework.response import Response
from rest_framework.views import APIView

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


class StudentDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin):
    """RetrieveModelMixin:查看一个存在的数据对象
    """
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request, pk):
        return self.retrieve(request, pk)

    def put(self, request, pk):
        return self.update(request, pk)

在这里插入图片描述

  • 查看是否修改成功
    在这里插入图片描述

DestroyModelMixin(删除视图扩展类)

  • 删除视图扩展类,提供**destroy(request, *args, kwargs)方法,可以快速实现删除一个存在的数据对象

  • 成功返回204状态码,不存在返回404状态码
    代码实现:

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, 
    DestroyModelMixin
from rest_framework.response import Response
from rest_framework.views import APIView

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


class StudentDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    """RetrieveModelMixin:查看一个存在的数据对象
       UpdateModelMixin:更新一个存在的数据对象
       DestroyModelMixin:删除一个存在的数据对象
    """
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers

    def get(self, request, pk):
        return self.retrieve(request, pk)

    def put(self, request, pk):
        return self.update(request, pk)

    def delete(self, request, pk):
        return self.destroy(request, pk)

在这里插入图片描述
在这里插入图片描述

  • 查看是否删除成功
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值