最全的 “Django“ 类视图 APIView GenericAPIView Mixin 快速实现增删改查

APIView (一级类视图)

1.创建模型类
#部门表
class Dept(models.Model):
    name = models.CharField(max_length=30)
    t_number = models.IntegerField()

    def __str__(self):
        return self.name

    class Meta:
        db_table='dept'
        
#生成迁移文件
python manage.py makemigrations
#迁移到数据库
python manage.py migrate
2.写序列化器
from rest_framework import serializers
from .models import Dept

#部门序列化器
class DeptSer(serializers.ModelSerializer):
    class Meta:
        model=Dept
        fields='__all__'
3.写接口
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Dept
from .serilizers import DeptSer

# Create your views here.
#获取所有部门信息
class DeptList(APIView):
    #查询所有部门
    def get(self,request):
        deptlist = Dept.objects.all()
        dept = DeptSer(deptlist,many=True)
        return Response(dept.data)
    #添加部门
    def post(self,request):
        ser = DeptSer(data=request.data)
        if ser.is_valid():
            ser.save()
        else:
            print(ser.errors)
        return Response('ok')
4.配制路由
from meiduo import views
urlpatterns = [
    path('deptlist/', views.DeptList.as_view()),
]
5.创建vue页面


GenericAPIView (二级类视图)

from rest_framework.generics import GenericAPIView

继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。

使用GenericAPIView类一般需要实现queryset属性或者重写get_queryset方法

支持定义的属性:
  • 列表视图与详情视图通用:
    • queryset列表视图的查询集
    • serializer_class视图使用的序列化器
  • 列表视图使用:
    • pagination_class分页控制类
    • filter_backends过滤控制后端
  • 详情页视图使用:
    • lookup_field查询单一数据库对象时使用的条件字段,默认为’pk
    • lookup_url_kwarg查询单一数据时URL中的参数关键字名称,默认与look_field相同
提供的方法:
  • 列表视图与详情视图通用:

    • get_queryset(self)

      返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

      def get_queryset(self):
          user = self.request.user
          return user.accounts.all()
      
    • get_serializer_class(self)

      返回序列化器类,默认返回serializer_class,可以重写,例如:

      def get_serializer_class(self):
          if self.request.user.is_staff:
              return FullAccountSerializer
          return BasicAccountSerializer
      
    • get_serializer(self,_args, *_kwargs)

      返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。

      注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

  • 详情视图使用:

    • **get_object(self)**返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。

      若详情访问的模型类对象不存在,会返回404。

      该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

例1:查询所有

from rest_framework.generics import GenericAPIView

class DeptGenManage(GenericAPIView):
    #设置查询集
    queryset = Dept.objects.all()
    #设置序列化器
    serializer_class = DeptSer

    #获取所有部门信息
    def get(self,request):
        #获取查询集
        dept = self.get_queryset()
        #获取序列化对象
        ser = self.get_serializer(dept,many=True)
        return Response(ser.data)

例2:按id查询

path('detail/',views.DeptGenManage.as_view())
#正则路由  有名分组(?P<组名>正则表达式)
re_path(r'detail/(?P\d)',views.DeptGen.as_view())
#视图
class DeptGenManage(GenericAPIView):
    #设置查询集
    queryset = Dept.objects.all()
    #设置序列化器
    serializer_class = DeptSer
    lookup_field = 'id'
    #获取详细
    def get(self,request,id):
      	#通过id获取一条记录
        dept = self.get_object()
        ser = self.get_serializer(dept)
        return Response(ser.data)

Mixin类视图

使用基于类的视图的最大好处之一是它使我们能够轻松地组合可重用的行为

GenericAPIView* 只是提供了数据,对应的访问功能是没有实现的,所以 DRF 还有五个提供方法的混入类,可以完成基本增删改查功能,我们也叫 Mixin 混入类,通过 GenericAPIView* 与混入类的多继承**,可以实现更加复杂的接口功能,GenericAPIView* 提供数据*,而混入类提供操作

1)ListModelMixin 直接用List添加数据 展示数据 获取数据

列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。

该Mixin的list方法会对数据进行过滤和分页。

举例:

from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView

class ListModelView(ListModelMixin,GenericAPIView):

    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self,request):
        return self.list(request)

2)CreateModelMixin 添加数据

创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。

如果序列化器对前端发送的数据验证失败,返回400错误。

举例:

from rest_framework.mixins import CreateModelMixin

class ListModelView(CreateModelMixin,GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def post(self,request):
        return self.create(request)

3) RetrieveModelMixin 查询单个数据

详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。

如果存在,返回200, 否则返回404。

例如:

from rest_framework.mixins import RetrieveModelMixin

class ListModelView(RetrieveModelMixin,GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self,request,pk):
        return self.retrieve(request)

4)UpdateModelMixin 修改数据

更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。

同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。

成功返回200,序列化器校验数据失败时,返回400错误。

举例:

from rest_framework.mixins import UpdateModelMixin

class ListModelView(UpdateModelMixin,GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def put(self,request,pk):
      return  self.update(request)

5)DestroyModelMixin 删除数据

删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。

成功返回204,不存在返回404。

举例:

from rest_framework.mixins import DestroyModelMixin

class ListModelView(DestroyModelMixin,GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def delete(self,request,pk):
        return self.destroy(request)

综合案例

from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
#mixin实现添加修改删除
class DeptMixinMange(GenericAPIView,ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin):
    #返回所有数据
    queryset = Dept.objects.all()
    serializer_class = DeptSer
    lookup_field='id'
    #获取所有数据
    def get(self,request):
        return self.list(request)
    #添加数据
    def post(self,request):
        return self.create(request)
    #更新数据
    def put(self,request,id):
        return self.update(request)
    #删除数据
    def delete(self,request,id):
        return self.destroy(request)

通用类视图 generics

通过使用mixin类,我们重写了视图,使其使用的代码比以前稍微少一些,但我们还可以更进一步。REST框架提供了一组已经混合在一起的通用视图,我们可以使用它们来进一步精简views.py模块。

class GenericList(generics.ListCreateAPIView):
    queryset = Dept.objects.all()
    serializer_class = DeptSer

子类视图(三级类视图) ****

1) CreateAPIView ***

提供 post 方法

继承自: GenericAPIView、CreateModelMixin

class TeacherCreateView(CreateAPIView):    
		serializer_class = TeacherCreateSer
2)ListAPIView ***

提供 get 方法

继承自:GenericAPIView、ListModelMixin

class TeacherListView(ListAPIView):    
  	queryset = Teacher.objects.all()  # 你要序列化的哪些数据结果    
		serializer_class = TeacherListSer  # 用什么序列化器
3)RetireveAPIView ***

提供 get 方法

继承自: GenericAPIView、RetrieveModelMixin

class GenericList(RetrieveAPIView):
    queryset = Dept.objects.all()    
    serializer_class = DeptSer
    lookup_field='id'
4)DestroyAPIView ****

提供 delete 方法

继承自:GenericAPIView、DestoryModelMixin

class GenericList(DestroyAPIView):
    queryset = Dept.objects.all()    
    serializer_class = DeptSer
    lookup_field='id'
5)UpdateAPIView ***

提供 put 和 patch 方法

继承自:GenericAPIView、UpdateModelMixin

class TeacherUpdateView(UpdateAPIView):   
  	lookup_field = 'pk'  # 数据库里的字段     
  	queryset = Teacher.objects.all()    
  	serializer_class = TeacherUpdateSer
6)RetrieveUpdateAPIView ***

提供 get、put、patch方法

继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

7)RetrieveUpdateDestoryAPIView *****

提供 get、put、patch、delete方法

继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

你可能感兴趣的:(django,django,python,数据库)