DRF思维导图及知识点总结
1.视图类-view
view:djngo自带的
请求对象:Django默认的HttpRequest对象
获取数据:
Get请求数据:request.GET
POST、PUT等请求数据:request.POST,request.FILES
返回对象:django提供的JsonResponse对象
返回数据:JsonResponse({})
class Book(View):
def get(self,request):
books = BookInfo.objects.all()
ser = BookSerializer(books,many=True)
return JsonResponse(ser.data,safe=False)
2.视图类-APIView(继承View)
请求对象:REST framework 提供的扩展了HttpRequest类的Request类的对象
获取数据:
Get请求数据:request.query_params
POST、PUT等请求数据:request.data
返回对象:rest_framework.response.Response提供的Response对象
返回数据:Response({})
class Book(APIView):
def get(self,request):
books = BookInfo.objects.all()
ser = BookSerializer(books,many=True)
return JsonResponse(ser.data)
3.视图类-GenericAPIView:继承APIView
请求对象:REST framework提供的扩展了HttpRequest类的Request类的对象。
获取数据:
GET请求数据:request.query_params
POST、PUT等请求数据:request.data
返回对象:rest_framework.response.Response提供的Response对象
返回数据:Response({})
作用:单独使用时,APIView跟GenericAPIView没有区别,只是实现方式不同,GenericAPIView主要配合五个拓展类使用
class Book(GenericAPIView):
query_set = BookInfo.object.all() # 指定当前视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
get get(self,request):
books = self.get_queryset() # 获取查询集中的所有数据
ser = self.get_serializer(books,many = True) # 使用指定序列化器,获取序列化器对象
return Response(ser.data)
4.五个扩展类:CreateModelMixin, ListModelMixin,UpdateModelMixin, DestroyModelMixin,RetrieveModelMixin:继承object
主要是给GenericAPIView提供常见的增删改查函数
class Books(GenericAPIView, CreateModelMixin, ListModelMixin,UpdateModelMixin, DestroyModelMixin,RetrieveModelMixin):
query_set = BookInfo.object.all() # 指定当前视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
def put(self,request,pk):
return self.update(request,pk)
def delete(self,request,pk):
return self.destroy(request,pk)
def get(self, request, pk):
return self.retrieve(request, pk)
5.两个扩展类子类:封装GenericAPIView和五个扩展类
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.response import Response
from book_drf.serializer import BookSerializer
from books.models import BookInfo
# Create your views here.
class Books(ListCreateAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
class BookDRFView(RetrieveUpdateDestroyAPIView):
"""
更新书籍
删除书籍
"""
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
视图集:
一系列逻辑相关的动作动作可以放到同一个类中,例如查询所有图书与查询单图书,只需要一个类
list() 提供一组数据
retrieve() 提供单个数据
create() 创建数据
update() 保存数据
destory() 删除数据
ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。
视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上
常用视图集父类
1) ViewSet
继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。
在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
2)GenericViewSet
继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。
在GenericViewSet中,需要我们自己实现action方法。
3)ModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
在ModelViewSet中,不需要我们自己实现action方法。
4)ReadOnlyModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。
在ReadOnlyModelViewSet中,不需要我们自己实现action方法中的查询所有数据和查询单一数据。
视图集中定义附加action动作
在视图集中,除了上述默认的方法动作外,还可以添加自定义动作。
添加自定义动作需要使用rest_framework.decorators.action装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
action装饰器可以接收两个参数:
methods: 该action支持的请求方式,列表传递
detail: 表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
True 表示使用通过URL获取的主键对应的数据对象
False 表示不使用URL获取主键
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# detail为False 表示不需要处理具体的BookInfo对象
@action(methods=['get'], detail=False)
def latest(self, request):
"""
返回最新的图书信息
"""
book = BookInfo.objects.latest('id')
serializer = self.get_serializer(book)
return Response(serializer.data)
# detail为True,表示要处理具体与pk主键对应的BookInfo对象
@action(methods=['put'], detail=True)
def read(self, request, pk):
"""
修改图书的阅读量数据
"""
book = self.get_object()
book.bread = request.data.get('read')
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
标签:知识点,get,导图,self,request,视图,action,serializer,DRF
From: https://www.cnblogs.com/zx0524/p/17149636.html