痛点
经过之前的过滤引擎、分页引擎的学习后,会发现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
- 提供
list(request, *args, **kwargs)
方法 - 获取模型类已存在的列表数据(多条数据)
- 获取成功,则返回200 OK
CreateModelMixin
:无需id
- 提供
create(request, *args, **kwargs)
方法 - 创建新的模型实例数据(创建新的记录)
- 创建成功,则返回200 OK
RetrieveModelMixin
:需id
- 提供
retrieve(request, *args, **kwargs)
方法 - 获取已存在的详情数据(一条)
- 获取成功,则返回200 OK
- 获取失败,则返回404 Not Found
UpdateModelMixin
:需id
- 提供
update(request, *args, **kwargs)
方法,用于全部更新 - 提供
partial_update(request, *args, **kwargs)
方法,用于部分更新,支持PATCH方法 - 更新已存在的模型实例(更新一条)
- 更新成功,则返回200 OK
- 更新失败,则返回 400 Bad Request
- 如果不存在,则返回404 Not Found
DestroyModelMixin
:需id
- 提供
destroy(request, *args, **kwargs)
方法,用于删除 - 删除一条已存在的数据(一条记录)
- 删除成功,则返回200 OK
- 删除失败,则返回 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
的代码
- 类分别继承所需要的
mixins
的方法(然后再继承GenericAPIView
) - 方法内的代码都删除,修改成调用对应
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)