进行通用视图的使用,其中每个继承类中包含多个action方法
# a.python中支持多重继承,一个类可以同时继承多个父类
# b.类中的方法和属性是按照__mro__所指定的继承顺序进行搜索
ListCreateAPIView类中包含了list和create方法
from django.http import JsonResponse
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework import status
from rest_framework import filters
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from .models import Projects
from .serializers import ProjectSerilizer, ProjectModelSerializer
from utils.pagination import PageNumberPagination
class ProjectsView(generics.ListCreateAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
search_fields = ['=name', '=leader', '=id']
ordering_fields = ['id', 'name', 'leader']
# 可以在类视图中指定分页引擎类,优先级高于全局
pagination_class = PageNumberPagination
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 ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset or creating a model instance.
"""
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 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)
class CreateModelMixin:
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
可以把多个action进行融合到一起
class ProjectsDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectSerilizer
# def get(self, request, *args, **kwargs):
# # instance = self.get_object()
# # serializer = self.get_serializer(instance=instance)
# # return Response(serializer.data, status=status.HTTP_200_OK)
# return self.retrieve(request, *args, **kwargs)
#
# def put(self, request, *args, **kwargs):
# # instance = self.get_object()
# # serializer = self.get_serializer(instance=instance, data=request.data)
# # serializer.is_valid(raise_exception=True)
# # serializer.save()
# # return Response(serializer.data, status=status.HTTP_201_CREATED)
# return self.update(request, *args, **kwargs)
#
# def delete(self, request, *args, **kwargs):
# # instance = self.get_object()
# # instance.delete()
# # return Response(status=status.HTTP_204_NO_CONTENT)
# return self.destroy(request, *args, **kwargs)
进行继承视图集,里面包含了所以的action方法
a.可以继承视图集父类ViewSet
# b.在定义url路由条目时,支持给as_view传递字典参数(请求方法名与具体调用的action方法名的一一对应关系)
# c.ViewSet继承了ViewSetMixin, views.APIView
# d.具备APIView的所有功能
# e.继承ViewSetMixin,所有具备持给as_view传递字典参数(请求方法名与具体调用的action方法名的一一对应关系)
class ProjectViewSet(viewsets.ModelViewSet):
"""
定义视图集
"""
# def list(self, request, *args, **kwargs):
# pass
# def retrieve(self, request, *args, **kwargs):
# pass
# def create(self, request, *args, **kwargs):
# pass
# def update(self, request, *args, **kwargs):
# pass
#
# def partial_update(self, request, *args, **kwargs):
# pass
#
# def destroy(self, request, *args, **kwargs):
# pass
queryset = Projects.objects.all()
serializer_class = ProjectSerilizer
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
"""
The GenericViewSet class does not provide any actions by default,
but does include the base set of generic view behavior, such as
the `get_object` and `get_queryset` methods.
"""
pass
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
使用视图集时,需要在子应用的urls.py文件中进行重新配置路由
from django.urls import path
# from projects.views import get_project, create_project, put_project, delete_project
# from projects import views
from . import views
urlpatterns = [
# path('get/', views.get_project),
# path('create/', views.create_project),
# path('put/', views.put_project),
# path('delete/', views.delete_project),
# path('a/', views.delete_project)
# path('projects/', views.projects),
# 定义类视图的路由条目
# a.类视图.as_view()
# path('projects/<int:pk>/', views.ProjectsView.as_view()),
# path('projects/', views.ProjectsView.as_view()),
path('projects/', views.ProjectViewSet.as_view({
'get': 'list',
'post': 'create'
})),
# path('projects/<int:pk>/', views.ProjectsDetailView.as_view()),
path('projects/<int:pk>/', views.ProjectViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})),
]