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  彡心如止水彡  阅读(66)  评论(0)    收藏  举报