两个视图基类APIView、GenericAPIView
1、APIView类:
APIView
是REST framework提供的所有视图的基类,继承自Django的View
父类。
APIView
与View
的不同之处在于:
- 传入到视图方法中的是REST framework的
Request
对象,而不是Django的HttpRequeset
对象; - 视图方法可以返回REST framework的
Response
对象,视图会为响应数据设置(render)符合前端要求的格式; - 任何
APIException
异常都会被捕获到,并且处理成合适的响应信息; - 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
支持定义的属性
- authentication_classes 列表或元祖,身份认证类
- permissoin_classes 列表或元祖,权限检查类
- throttle_classes 列表或元祖,流量控制类
基于APIView类写的接口:
class BooksView(APIView):
def get(self, request):
book_list = Book.objects.all()
book_ser = Bookserialisers(book_list, many=True)
return Response(book_ser.data)
def post(self, request):
book_ser = Bookserialisers(data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'code': '101', 'msg': '添加失败', 'data': book_ser.errors})
class BookView(APIView):
def get(self, request, pk):
book = Book.objects.filter(pk=pk).first()
book_ser = Bookserialisers(book)
return Response(book_ser.data)
def put(self, request, pk):
book = Book.objects.filter(pk=pk).first()
book_ser = Bookserialisers(instance=book, data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response(book_ser.errors)
def delete(self, request, pk):
ret = Book.objects.filter(pk=pk).delete()
return Response({'status': 100, 'msg': '删除成功'})
2、GenericAPIView
(1)继承APIView类,加入了操作序列化器和数据库操作方法。基于GenericAPIView类的接口如下
from rest_framework.generics import GenericAPIView
'''
属性
queryset:指明使用的数据查询集
serializer_class:指明当前视图函数使用的序列化器
方法:
get_queryset():返回的是数据库查询结果集,一般数据查询结果有多条数据的时候使用该方法
get_object():返回的是数据库查询结果(单条),一般是查询结果数据只用一条的时候使用该方法。
get_serializer:返回序列化对象
'''
# GenericAPIView接口
class Books1View(GenericAPIView):
queryset = Book.objects
serializer_class = Bookserialisers
def get(self, request):
#get_queryset()方法返回的是数据库查询结果集
book = self.get_queryset()
#返回序列化对象
book_ser = self.get_serializer(book, many=True)
return Response(book_ser.data)
def post(self, request):
book_ser = self.get_serializer(data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'msg': '添加失败'})
class Book1View(GenericAPIView):
queryset = Book.objects
serializer_class = Bookserialisers
def get(self, request, pk):
#get_boject()返回的是数据库查询结果。
book = self.get_object()
book_ser = self.get_serializer(book)
return Response(book_ser.data)
def put(self, request, pk):
book = self.get_object()
book_ser = self.get_serializer(instance=book, data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response(book_ser.errors)
def delete(self, request, pk):
book = self.get_object().delete()
return Response({'msg': '删除成功'})
基于GenericAPIView类的五个视图扩展类
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin,DestroyModelMixin
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateAPIView,RetrieveUpdateDestroyAPIView,RetrieveDestroyAPIView
这五个类将5个接口分别进行了封装
类名 | 方法(需要传参数) | 请求方法 |
ListModelMixin | list() | get(查询所有) |
CreateModelMixin | create() | post |
UpdateModelMixin | update() | put |
RetrieveModelMixin | retrieve() | get(查询单个) |
DestroyModelMixin | destroy() | delete |
基于五个扩展类的接口
# 五个扩展类
class Books2View(ListModelMixin, GenericAPIView, CreateModelMixin):
queryset = Book.objects
serializer_class = Bookserialisers
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class Book2View(GenericAPIView, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin):
queryset = Book.objects
serializer_class = Bookserialisers
def get(self, request, pk):
return self.retrieve(request, pk)
def put(self, request, pk):
return self.update(request, pk)
def delete(self, request, pk):
return self.destroy(request, pk)
注意: GenericViewSet + 五个扩展类接口等价与视图集功能
#注册
class Register(GenericViewSet,CreateModelMixin):
queryset = models.E_User.objects.all()
serializer_class = User_ser
#查询
class Search(GenericViewSet,RetrieveModelMixin):
queryset = models.E_User.objects.all()
serializer_class = User_ser
#更新
class Update(GenericViewSet,UpdateModelMixin):
queryset = models.E_User.objects.all()
serializer_class = User_ser
#等价于
class update(ModelViewSet)
GenericAPIView九个功能子类视图:
类名 | 方法: |
ListAPIView | get() |
CreateAPIView | create() |
RetrieveUpdateAPIView | retrieve() |
DestroyAPIView | delete() |
UpdateAPIView | update |
ListCreateAPIView | list(),create(),patch() |
RetrieveUpdateAPIView | retrieve(),update(),patch() |
RetrieveDestroyAPIView | retrieve(),destroy(),patch() |
RetrieveUpdateDestroyAPIView | retrieve(),update(),destroy(),patch() |
#查询所有书籍和添加书籍
class Books_zuhe(ListCreateAPIView):
queryset = Book.objects
serializer_class = Bookserialisers
#书籍的查删改
class Book_zuhe(RetrieveUpdateDestroyAPIView):
queryset = Book.objects
serializer_class = Bookserialisers
视图集
ModelViewSet继承了GenericViewSet,提供了action方法。除了默认的五个接口方法外,还可以自己定义新的方法:
路由文件urls
urlpatterns = [ url(r'^books/latest/$', views.BookViewSet.as_view({'get': 'latest'})), url(r'^books/(?P<pk>\d+)/$', views.BookViewSet.as_view({'get': 'retrieve'})), url(r'books3/', views.BookViewSet.as_view(actions={'get':'list','post':'create'})), url(r'book3/(?P<pk>\d+)', views.BookViewSet.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})), ]
基于ModelViewSet类接口代码#ModelViewSet接口 class BookViewSet(ModelViewSet): queryset = Book.objects serializer_class = Bookserialisers def latest(self, request): """ 返回最新的图书信息 """ book = Book.objects.latest('id') serializer = self.get_serializer(book) return Response(serializer.data) 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)