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)

img