35.Django_类视图_Mixins

本文探讨了在Django中视图代码增多导致的复用和维护问题,并介绍了如何通过类视图Mixins进行优化。回顾了 Mixins 的作用,详细讲解了各个方法的逻辑,如获取、创建、更新和删除操作,并提供了源码分析及代码优化的实例。
摘要由CSDN通过智能技术生成

痛点
经过之前的过滤引擎、分页引擎的学习后,会发现view视图的代码越来越多,复用和维护又变得困难了。本次就想方法来解决这个痛点

一、回顾views.py中,关于project的代码

1.1、5个方法,分为了两个类来写的原因

ProjectsList类:都是不需要id值的
a.添加project信息的post方法
b.获取所有的project信息的get方法。
-ProjectDetail类:都是需要id值的
a.根据id返回指定project信息的get方法
b.根据id和传来的信息,修改指定project信息的post方法
c.根据id,删除指定project信息的delete方法
所以urls.py中路由也是分开两种:

urlpatterns = [
    path('projects/', views.ProjectsList.as_view()),
    path('projects/<int:pk>/', views.ProjectDetail())
]

二、 rest_framework.mixins

2.1、rest_framework.mixins的几个方法中的代码实现逻辑,分别上面之前实现的方法的代码实现逻辑一样

  • ListModelMixin:无需id
  1. 提供list(request, *args, **kwargs)方法
  2. 获取模型类已存在的列表数据(多条数据)
  3. 获取成功,则返回200 OK
  • CreateModelMixin:无需id
  1. 提供create(request, *args, **kwargs)方法
  2. 创建新的模型实例数据(创建新的记录)
  3. 创建成功,则返回200 OK
  • RetrieveModelMixin:需id
  1. 提供retrieve(request, *args, **kwargs)方法
  2. 获取已存在的详情数据(一条)
  3. 获取成功,则返回200 OK
  4. 获取失败,则返回404 Not Found
  • UpdateModelMixin:需id
  1. 提供update(request, *args, **kwargs)方法,用于全部更新
  2. 提供partial_update(request, *args, **kwargs)方法,用于部分更新,支持PATCH方法
  3. 更新已存在的模型实例(更新一条)
  4. 更新成功,则返回200 OK
  5. 更新失败,则返回 400 Bad Request
  6. 如果不存在,则返回404 Not Found
  • DestroyModelMixin:需id
  1. 提供destroy(request, *args, **kwargs)方法,用于删除
  2. 删除一条已存在的数据(一条记录)
  3. 删除成功,则返回200 OK
  4. 删除失败,则返回 404 Not Found

2.2、查看rest_framework的源码,

会发现mixins.ListModelMixin类的代码和之前使用的获取所有projecet信息的get方法一样:

class ListModelMixin:    
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

2.3、优化之前views.py中关于project的代码

  1. 类分别继承所需要的mixins的方法(然后再继承GenericAPIView
  2. 方法内的代码都删除,修改成调用对应mixins的方法
    代码如下:
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from rest_framework.generics import GenericAPIView
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import mixins

## 注意先继承mixins的方法
class ProjectsList(mixins.ListModelMixin,
                   mixins.CreateModelMixin,
                   GenericAPIView):
    ordering_fields = ['name', 'leader']
    queryset =Projects.objects.all()
    serializer_class = ProjectModelSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'desc']

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
    def post(self, request,*args,**kwargs):
        return self.create(request, *args, **kwargs)


class ProjectDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    GenericAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer    
    def get(self, request, *args,**kwargs):
        return self.retrieve(request, *args, **kwargs)
    def put(self, request, *args,**kwargs):
        return self.update(request, *args, **kwargs)
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值