Drf-GenericAPIView以及其子类

1、背景:

     GenericAPIView 基础于  APIView ,提供了3个方法,三个属性。对APIView做了进一步的封装,可以通mixins子类配合使用,直接调用mixins实现的方法既可。除了支持APIView视图所有的功能,还支持过滤、分页、排序等功能

2、常用属性和方法:

      三个属性

  • queryset 执行查询集合
  • serializer_class 指定序列化器
  • lookup_field = ‘pk’  GenericAPIView类属性中 默认 ,主要get_object 在用 修改 lookup_url_kwargs 或者 lookup_field,在配合路由就拿到需求修改的主键,这里只是修改了参数名

 

      三个方法

  • get_object 单条查询,不需要传主键(默认pk),来源于 lookup_field = 'pk',如果需要指定 则需要变更 lookup_url_kwargs = 'pk1'  同时配合 路由修改
  • get_serializer(instance = book,many=True)
  • get_queryset拿到 查询结合 源码中其实 还是获取属性 queryset 

    

3、使用:

     2.1:独立使用

            依然需要重写 get post  

from rest_framework.generics import GenericAPIView
from book.models import BookInfo
from book.serializers import BookInfoModelSerializer
from rest_framework import stauts
class BookDetailGenericView(GenericAPIView): # 设置查询结果集属性 queryset = BookInfo.objects.all() # 重写查询结果集方法 # def get_queryset(self): # return BookInfo.objects.all() # 设置序列化器属性 serializer_class = BookInfoModelSerializer # 重写返回序列化器方法 # def get_serializer_class(self): # return BookInfoModelSerializer # 默认是pk # 可以修改为 id, 如果修改, # 则 get,put,delete 方法中的关键字参数都要改变 lookup_field = 'pk' def get(self,request,pk): #1.查询指定书籍 book = self.get_object() #2.创建序列化器,传递模型对象 serializer = self.get_serializer(book) #3.获取字典数据,并返回响应 return Response(serializer.data) def put(self,request,pk): #1.查询指定书籍 book = self.get_object() #2.创建序列化器,传递模型对象和接收的参数 serializer = self.get_serializer(instance=book,data=request.data) # 3.验证数据,并根据验证结果进行判断 if serializer.is_valid(): # 4.数据验证没有问题,调用序列化器的save方法。来触发序列化器的update方法 # update方法会调用模型来更新到数据库中 serializer.save() # 5. 返回响应 serializer.data 就是字典数据 return Response(serializer.data) else: # 返回错误信息 return Response({'msg': '保存失败'}) def delete(self,request,pk): #1.查询指定书籍 book = self.get_object() #2.删除 book.delete() #3.返回响应 return Response(status=status.HTTP_204_NO_CONTENT)

  

 

     2.2:配合mixins 子类使用

            mixins 包含5个子类,mixins类继承于object,通常配合 GenericAPIView 使用

mixins.RetrieveModelMixin
单条数据查询接口,实现了 
retrieve 方法 
mixins.UpdateModelMixin
单条数据更新接口,实现了 
update
方法
mixins.DestroyModelMixin
单条数据删除接口,实现了 
destroy
方法
 
mixins.ListModelMixin
所有数据查询接口,实现了 
list
方法
 
mixins.CreateModelMixin
 单条数据查询接口,实现了 
create
方法

 

                

CreateModelMixin,GenericAPIView 配合使用 ,其他的以此类推
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)

  

 

    2.3:    9个子类 这些子类其实继承了 GenericAPIView以及 mixins的子类,并且重写的get post 等方法 里边其实调用的还是 mixins子类中是先的方法,只是在原有的基础上又包了一层

           

序号
类名
备注
1
CreateAPIView
创建数据,对应post,只实现了CreateModelMixin.create方法
2
ListAPIView
查询全部数据,对应get,只实现了ListModelMixin.list方法
3
DestroyAPIView
删除数据,对应delete,只实现了DestoryModelMixin.destory 方法
4
UpdateAPIView
更新数据,对应put,只是实现了 UpdateModelMixin.update 方法
5
RetrieveAPIView
查询单条数据,对应get,只是实现了RetrieveModelMixin.retrieve 方法
6
RetrieveUpdateAPIView
对应 get、put,实现了 4--5
7
ListCreateAPIView
对应 get、post,实现了 1--2
8
RetrieveDestroyAPIView
对应 get、delete,实现了 5--3
9
RetrieveUpdateDestroyAPIView
对应 get、delete,put ,实现了 5--3--4

 

 

 

                其他的 以此类推 或者不重写 方法也行

class BookGenSub1(ListAPIView,CreateAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView): # 直接继承 就实现了 get 和post 方法
    queryset = Book.objects
    serializer_class = BookModelSerializer
    # 重写get 方法
    def get(self, request, *args,**kwargs):
        return self.retrieve(request, *args,**kwargs)

  

 

posted @ 2022-08-28 17:27  Yuan_x  阅读(56)  评论(0编辑  收藏  举报