一、五个拓展类(配合GenericAPIView)继承自object,这五个拓展类里都对应的封装好了相应的功能,我们只需要调用里面的方法就可以了
ListModelMixin:获取多个数据对象
CreateModelMixin:保存数据
RetrieveModelMixin:获取单一数据对象
UpdateModelMixin:更新数据
DestroyModelMixin:删除数据。
这五个拓展类是配合GenericAPIView使用的
所以还是用GenericaAPIView的视图类代码,这个时候就应该导入
这些拓展类为什么要和GenericaAPIView 一块使用呢,点ListModelMixin源码看一下。
发现里面的list方法里调用了get_serializer方法,这个方法是Generica提供的,所以要和GenericaAPIView配合使用。
代码如下:
from django.shortcuts import render
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, \
RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.request import Request
from rest_framework.response import Response
class Books(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def get(self, request):
# 调用ListModelMixin里的list方法就可以了,把request传进去
return self.list(request)
def post(self, request):
# 调用CreateModelMixin里的create方法
return self.create(request)
class Book(GenericAPIView, RetrieveModelMixin):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def get(self, request, pk):
return self.retrieve(request, pk)
class BookDRFView(GenericAPIView, UpdateModelMixin, DestroyModelMixin):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
def put(self, request, pk):
return self.update(request, pk)
def delete(self, request, pk):
return self.destroy(request, pk)
二、拓展类子类从上图可以看出总共有九个,分别是
ListCreateAPIView、
ListAPIView、
CreateAPIView、
DestroyAPIView、
RetrieveDestroyAPIView、
RetrieveAPIView、
RetrieveUpdateDestroyAPIView、
RetrieveUpdateAPIView、
UpdateAPIView
可以看出这些子类是几个拓展类的复合,所以获取所有数据和保存数据就可以直接用这个拓展类子类ListCreateAPIView。删除数据、更新数据,可以直接用这个子类RetrieveUpdateDestroyAPIView。
点进去 ListCreateAPIView,可以从源码中看出,这个子类已经实现了 get 和post方法。
点进去 RetrieveUpdateDestroyAPIView,可以看出子类已经实现了更新和删除 获取单一数据方法
那么修改后的代码如下:
from django.shortcuts import render
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializer
from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView, \
RetrieveAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin, \
RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.request import Request
from rest_framework.response import Response
class Books(ListCreateAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
class Book(RetrieveAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
class BookDRFView(RetrieveUpdateDestroyAPIView):
queryset = BookInfo.objects.all() # 指定当前类视图使用的查询集数据
serializer_class = BookSerializer # 指定当前类视图使用的序列化器
总结: