视图集
"""
视图集
特点:
1,可以将一组相关的操作, 放在一个类中进行完成
2,不提供get,post方法, 使用retrieve, create方法来替代
3,可以将标准的请求方式(get,post,put,delete), 和mixin中的方法做映射
常见的视图集:
类名称 父类 作用
ViewSet APIView 可以做路由映射
ViewSetMixin
GenericViewSet GenericAPIView 可以做路由映射,可以使用三个属性,三个方法
ViewSetMixin
ModelViewSet GenericAPIView 所有的增删改查功能,可以使用三个属性,三个方法
5个mixin类
ReadOnlyModelViewSet GenericAPIView 获取单个,所有数据,可以使用三个属性,三个方法
RetrieveModelMixin
ListModelMixin
"""
路由映射 是由 ViewSetMixin
viewSet
view
from .models import BookInfo
from django.shortcuts import get_object_or_404
from .serializers import BookInfoSerializer
from rest_framework import viewsets
from rest_framework.response import Response
class BookViewSet(viewsets.ViewSet):
"""
A simple ViewSet for listing or retrieving users.
"""
def list(self, request):
queryset = BookInfo.objects.all()
serializer = BookInfoSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
queryset = BookInfo.objects.all()
urls
from django.urls import path,include
from . import views
urlpatterns=[
......
ReadOnlyModelViewSet
view
from rest_framework import viewsets
class BookInfoReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
urls
# readonlymodelViewSet
path('ReadOnly_viewSet/',views.BookInfoReadOnlyViewSet.as_view({'get':'list'})),
path('ReadOnly_viewSet/<int:pk>', views.BookInfoReadOnlyViewSet.as_view({'get': 'retrieve'})),
ModelViewSet
view
from rest_framework.viewsets import ModelViewSet
class BookInfoModelViewSet(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
urls
path('model_viewSet/',views.BookInfoModelViewSet.as_view({'get':'list', 'post':'create'})),
path('model_viewSet/<int:pk>',
views.BookInfoModelViewSet.as_view({'get':
'retrieve','put':'update','delete':'destroy'}))
视图集额外动作
获取阅读量大于20的
views
from rest_framework.viewsets import ModelViewSet
from .serializers import BookInfoSerializers
from .models import BookInfo
from rest_framework.response import Response
class BookInfoViewSet(ModelViewSet):
serializer_class = BookInfoSerializers
queryset = BookInfo.objects.all()
def read_book(self,request):
books = BookInfo.objects.filter(bread__gt=30)
serializer = BookInfoSerializers(instance=books,many=True)
return Response(serializer.data,status=201)
urls
from django.urls import path,include
from . import views
urlpatterns=[
path('book/',
views.BookInfoViewSet.as_view({'get':'list','post':'create'})),
path('book/<int:pk>',
views.BookInfoViewSet.as_view({'get': 'retrieve', 'put': 'update','delete':'destroy'})),
]
修改指定id的阅读量
views
......
class BookInfoViewSet(ModelViewSet):
......
# 修改指定书籍
def updata_book_read(self,request,pk):
book = self.get_object()
data = request.data
serializer =
self.get_serializer(instance=book,data=data,partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data,status=200)
url
.......
urlpatterns=[
......
path('book/readbook/',
views.BookInfoViewSet.as_view({'get': 'read_book'})),
path('book/readbook/<int:pk>',
views.BookInfoViewSet.as_view({'put': 'updata_book_read'})),
]