痛點(diǎn)
經(jīng)過之前的過濾引擎愁拭、分頁引擎的學(xué)習(xí)后,會發(fā)現(xiàn)view視圖的代碼越來越多盏混,復(fù)用和維護(hù)又變得困難了。本次就想方法來解決這個(gè)痛點(diǎn)
一许赃、回顧views.py
中馆类,關(guān)于project
的代碼
1.1、5個(gè)方法乾巧,分為了兩個(gè)類來寫的原因
-
ProjectsList
類:都是不需要id值的
a.添加project信息的post方法
b.獲取所有的project信息的get方法沟于。 -
ProjectDetail
類:都是需要id值的
a.根據(jù)id返回指定project信息的get方法
b.根據(jù)id和傳來的信息,修改指定project信息的post方法
c.根據(jù)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
的幾個(gè)方法中的代碼實(shí)現(xiàn)邏輯,分別上面之前實(shí)現(xiàn)的方法的代碼實(shí)現(xiàn)邏輯一樣
ListModelMixin
:無需id
1.提供list(request, *args, **kwargs)
方法
2.獲取模型類已存在的列表數(shù)據(jù)(多條數(shù)據(jù))
3.獲取成功金句,則返回200 OKCreateModelMixin
:無需id
1.提供create(request, *args, **kwargs)
方法
2.創(chuàng)建新的模型實(shí)例數(shù)據(jù)(創(chuàng)建新的記錄)
3.創(chuàng)建成功,則返回200 OK
-
RetrieveModelMixin
:需id
1.提供retrieve(request, *args, **kwargs)
方法
2.獲取已存在的詳情數(shù)據(jù)(一條)
3.獲取成功违寞,則返回200 OK
4.獲取失敗偶房,則返回404 Not Found
UpdateModelMixin
:需id
1.提供update(request, *args, **kwargs)
方法,用于全部更新
2.提供partial_update(request, *args, **kwargs)
方法棕洋,用于部分更新,支持PATCH方法
3.更新已存在的模型實(shí)例(更新一條)
4.更新成功摄悯,則返回200 OK
5.更新失敗,則返回 400 Bad Request
6.如果不存在奢驯,則返回404 Not FoundDestroyModelMixin
:需id
1.提供destroy(request, *args, **kwargs)
方法,用于刪除
2.刪除一條已存在的數(shù)據(jù)(一條記錄)
3.刪除成功撒遣,則返回200 OK
4.刪除失敗管跺,則返回 404 Not Found
2.2、查看rest_framework的源碼豁跑,會發(fā)現(xiàn)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艇拍、優(yōu)化之前views.py
中關(guān)于project
的代碼
- 1.類分別繼承所需要的
mixins
的方法(然后再繼承GenericAPIView
) - 2.方法內(nèi)的代碼都刪除,修改成調(diào)用對應(yīng)
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)