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)