27 视图集

视图集

"""
视图集
特点:
  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()
       # 从 数据库对象中获取 pk=pk 的 如果正确返回 不正确则404
       Book = get_object_or_404(queryset, pk=pk)
       serializer = BookInfoSerializer(Book)
       return Response(serializer.data)

urls

from django.urls import path,include
from . import views
​
urlpatterns=[
......
   # 视图集
   path('viewSet/',views.BookViewSet.as_view({'get':'list'})),
   path('viewSet/<int:pk>', views.BookViewSet.as_view({'get': 'retrieve'}))
]

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'})),
]

 

posted @ 2021-11-04 14:00  彡心如止水彡  阅读(90)  评论(0)    收藏  举报