DRF中的视图集使用

DRF中的视图集使用

常用的视图集有:

  • ViewSet
  • GenericViewSet
  • ModelViewSet
  • ReadOnlyModelViewSet

ViewSet
一个ViewSet类只是一种基于类的View,继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

在ViewSet中,它不提供任何方法处理程序,需要我们自己重写该类并明确实现action方法。

class BookViewSet(viewsets.ViewSet):

    def list(self, request):
    # 查所有
        pass

    def create(self, request):
    # 增
        pass

    def retrieve(self, request, pk=None):
    # 查具体某一个
        pass

    def update(self, request, pk=None):
    # 改全部
        pass

    def partial_update(self, request, pk=None):
    # 改部分
        pass

    def destroy(self, request, pk=None):
    # 删
        pass

一个ViewSet类同时提供以下可用属性

  • basename- 用于创建的URL名称的基础。
  • action- 当前动作的名称(例如list,create)。
  • detail- 布尔值,指示当前操作是否为列表或详细视图配置。
  • suffix- 视图类型的显示后缀 - 镜像detail属性。

例如:

from rest_framework.viewsets import ViewSet
from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from book.serializers import BookInfoModelSerializer

class BookViewSet(ViewSet):

    def list(self,request):
        queryset = BookInfo.objects.all()
        serializer = BookInfoModelSerializer(queryset,many=True)
        return Response(serializer.data)

    def retrieve(self,request,pk=None):
        queryset = BookInfo.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = BookInfoModelSerializer(user)
        return Response(serializer.data)

在设置路由时,我们可以如下操作

from django.urls import re_path
from book import views
urlpatterns = [
    re_path(r'^books/$',views.BookViewSet.as_view({'get':'list'})),
    re_path(r'^books/(?P<pk>\d+)/$',views.BookViewSet.as_view({'get':'retrieve'})),
]

替代方案为

from django.urls import re_path
from book import views

urlpatterns = [
    #re_path(r'^books/$',views.BookViewSet({'get':'list'})),
    #re_path(r'^books/(?P<pk>\d+)/$',views.BookViewSet({'get':'retrieve'})),
]

from rest_framework.routers import DefaultRouter

rounter = DefaultRouter()

rounter.register(r'books',views.BookViewSet,basename='')

urlpatterns += rounter.urls

注意: 通常情况下,我们经常使用提供默认行为集的现有基类,例如ModelViewSet

GenericViewSet

在这里插入图片描述

继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。在GenericAPIView中,没有提供任何动作action方法,需要我们自己覆盖该类并混合所需的混合类,或者明确定义操作实现action方法

ModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

ModelViewSet类所继承GenericAPIView,包括用于各种动作实现方式中,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

由提供的动作ModelViewSet类是.list(),.retrieve(),.create(),.update(),.partial_update(),和.destroy()

使用:

因为ModelViewSet扩展GenericAPIView,我们通常需要提供至少queryset和serializer_class属性

例如:

from rest_framework.viewsets import ModelViewSet
from book.serializers import BookInfoModelSerializer
from book.models import BookInfo

class BookModelViewSet(ModelViewSet):

    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

在设置路由时,我们可以如下操作

from book import views
urlpatterns = [
]

from rest_framework.routers import DefaultRouter
# 可以处理视图的路由器
router = DefaultRouter()
# 向路由器中注册视图集
router.register(r'books', views.BookModelViewSet,basename='')
#追加路由
urlpatterns += router.urls

视图集中定义附加action动作

如果你有特别的方法应该是可路由的,你可以用@action装饰器来标记它们。像常规操作一样,额外的操作可以用于对象列表或者单个实例。为了表明是否是单个实例,将detail参数设置为True

from rest_framework.viewsets import ModelViewSet
from book.serializers import BookInfoModelSerializer
from book.models import BookInfo
from rest_framework.decorators import action
from rest_framework import status

class BookModelViewSet(ModelViewSet):

    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    # detail为True表示操作单个实例,网址为这种形式:^books/{pk}/set_bookname/$
    @action(methods=['post'], detail=True)
    def set_bookname(self, request, pk=None):
        book = self.get_object()
        serializer = BookInfoModelSerializer(data=request.data)
        if serializer.is_valid():
            book.name = request.data['name']
            book.save()
            return Response({'message': '重置成功'})
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

    # detail为False表示列表,网址为这种形式:^books/order_comment/$
    @action(detail=False)
    def order_comment(self, request):
        books = self.get_queryset().order_by('-commentcount')
        serializer = self.get_serializer(books, many=True)
        return Response(serializer.data)
  • method指明请求方式(即,允许我们使用哪几种http请求方式来访问)
  • detail用于控制是否使用一组对象还是一个对象。(布尔值如为True,会获取PK数据,我们访问的视图函数的路由会变成/prefix/{pk}/视图函数名,如为False,则路由会变成/prefix/视图函数名)

路由设置不变

from book import views
urlpatterns = [
]

from rest_framework.routers import DefaultRouter
# 可以处理视图的路由器
router = DefaultRouter()
# 向路由器中注册视图集
router.register(r'books', views.BookModelViewSet,basename='')
#追加路由
urlpatterns += router.urls

ReadOnlyModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。

与ModelViewSet它一样,它还包括各种操作的实现,但不同于ModelViewSet只提供“只读”操作,list()而且retrieve()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值