目录
1.1.CreateModelMixin:create()=====视图类:post() 创建对象
1.2.ListModelMixin:list()=====视图类:get() 列出所有对象
1.3.RetrieveModelMixin:retrieve()=====视图类:get() 查询详情对象
1.4.UpdateModelMixin:update()=====视图类:put() 修改
1.5.DestroyModelMixin:destroy()=====视图类:delete() 删除
from rest_framework import mixins
2.2.2 在类视图的get,post,put,delete方法中用Mixin的拓展类的方法替代
1.mixins.py模块中的Mixin拓展类包括:
1.1.CreateModelMixin:create()=====视图类:post() 创建对象
1.2.ListModelMixin:list()=====视图类:get() 列出所有对象
1.3.RetrieveModelMixin:retrieve()=====视图类:get() 查询详情对象
1.4.UpdateModelMixin:update()=====视图类:put() 修改
1.5.DestroyModelMixin:destroy()=====视图类:delete() 删除
以上可以发现,我们自定义的类视图中的get,post,put,delete方法,在Mixin拓展类中都有对应的扩展类及方法实现,所以,我们可以直接继承mixins模块中的各个拓展类,直接使用拓展类的拓展方法即可
2.类视图继承Mixin的拓展类
2.1 导入mixins模块
from rest_framework import mixins
2.2 类视图继承Mixin拓展类
2.2.1 我们类视图中的get方法和Mixin扩展类中的ListModelMixin的list()方法,
RetrieveModelMixin类中的retrieve()方法代码相同,
post方法和CreateMoelMixin类中的create()方法代码相同,
put方法和UpdateModelMixin类中的update()方法相同,
delete方法和DestroyModelMixin类中的destroy()方法相同,
所以需要继承以上5个Mixin拓展类
2.2.2 在类视图的get,post,put,delete方法中用Mixin的拓展类的方法替代
import json
from django.http import HttpResponse, JsonResponse
# 子应用视图
from django.views import View
from rest_framework import status, filters
from rest_framework.filters import OrderingFilter
from rest_framework.generics import GenericAPIView
from rest_framework.renderers import JSONRenderer
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import mixins
from projects.models import Projects
# from projects.serializers import ProjectSerializer
from projects.serializers import PorjectModelSerializer
from utils.pagination import PageNumberPagination
class JsonDecoderError111(BaseException):
"""
1.serializers.ModelSerializer提供模型对象序列化+create()方法+update()方法
2。APIView 提供从request.data中获取请求参数+返回Response()对象
"""
pass
# class ProjectsView(View):
# class ProjectsView(APIView):
# class ProjectsView(GenericAPIView):
class ProjectsView(mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView):
"""
继承GenericAPIView(或者其子类)的类视图
1。具备View的所有特性
2。具备APIView中的认证,授权,限流功能
3。支持对于获取列表数据接口的搜索,排序,分页功能
"""
queryset = Projects.objects.all()
serializer_class = PorjectModelSerializer
# filter_backends在继承了GenericAPIView的类视图中指定过滤引擎,优先级>全局配置
# filter_backends = [filters.SearchFilter, OrderingFilter]
# 2。 类视图中指定可用于过滤查询的字段search_fields = [xxx]
search_fields = ['^full_name', 'id']
# 配置过滤器类
filter_backends = [filters.SearchFilter, OrderingFilter]
# 排序字段
ordering_fields = ['full_name', 'leader', 'id']
# 指定自定义的分页器引擎(先导入)
pagination_class = PageNumberPagination
def get(self, request, *args, **kwargs):
# queryset = self.filter_queryset(queryset=self.get_queryset())
# page_queryset = self.paginate_queryset(queryset=queryset)
# if page_queryset is not None:
# serializer = self.get_serializer(instance=page_queryset, many=True)
# return self.get_paginated_response(serializer.data)
# serializer = self.get_serializer(instance=queryset, many=True)
# return Response(serializer.data, status=status.HTTP_200_OK)
# 直接调用父类 mixins.ListModelMixin的list()方法
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
# serializer = self.get_serializer(data=request.data)
# serializer.is_valid(raise_exception=True)
# serializer.save()
# return Response(serializer.data, status=status.HTTP_201_CREATED)
# 直接调用父类 mixins.CreateModelMixin的create()方法
return self.create(request, *args, **kwargs)
class ProjectDetailView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView):
queryset = Projects.objects.all()
serializer_class = PorjectModelSerializer
# 自定义lookup_field 值
lookup_url_kwarg = 'pk'
# def get(self, request, pk):
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)
# 直接调用父类 mixins.RetrieveModelMixin的retrieve()方法
return self.retrieve(request, *args, **kwargs)
def put(self, request: 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)
# 直接调用父类 mixins.UpdateModelMixin的update()方法
return self.update(request, *args, **kwargs)
def delete(self, request: Request, *args, **kwargs):
# instance = self.get_object()
# count = instance.delete()
# result = {
# 'msg': f'删除{args}成功',
# 'count': count,
# }
# return Response(data=result, status=204)
# 直接调用父类 mixins.DestroyModelMixin的destroy()方法
return self.destroy(request, *args, **kwargs)
经测试,改造后的get,post,put,delete方法均正常.