7.9.8视图集

7.9.8视图集

(1)视图集介绍

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。

(2)常用视图集父类

1)ViewSet

继承自APIView与ViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。

在ViewSet中,没有提供任何动作action方法,需要自己实现action方法。

2)GenericViewSet

GenericViewSet继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。

3)ModelViewSet

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

4)ReadOnlyModelViewSet

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

(3)视图集基本使用

使用视图集获取列表数据和单一数据

①视图

class BookInfoViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin,GenericViewSet):

    """使用视图集实现返回列表数据和单一数据"""

    queryset = BookInfo.objects.all()

    serializer_class = BookInfoSerializer

②路由

# 演示GenericViewSet视图集

url(r'^books/$',views.BookInfoViewSet.as_view({'get':'list'})),

url(r'^books/(?P<pk>\d+)/$',views.BookInfoViewSet.as_view({'get':'retrieve'})),

(4)视图集中定义附加action动作

1)需求

追加读取倒序后的最新数据逻辑,追加修改阅读量的逻辑

2)实现

①视图

在 BookInfoViewSet这个视图中添加:

def latest(self, request):

    """

    追加action:返回书籍倒序后的第0个的图书信息

    GET /books/latest
    
    """

    book = BookInfo.objects.latest('id')

    serializer = self.get_serializer(book)

    return Response(serializer.data)



def read(self, request, pk):

    """

    追加action:修改图书的阅读量数据

    PUT /books/<pk>/read

    """

    book = self.get_object()

    book.bread = request.data.get('read')

    book.save()

    serializer = self.get_serializer(book)

    return Response(serializer.data)

②路由

# 演示GenericViewSet视图集

url(r'^books/$',views.BookInfoViewSet.as_view({'get':'list'})),

url(r'^books/(?P<pk>\d+)/$',views.BookInfoViewSet.as_view({'get':'retrieve'})),

# 追加action

url(r'^books/latest/$',views.BookInfoViewSet.as_view({'get':'latest'})),

url(r'^books/(?P<pk>\d+)/read/$',views.BookInfoViewSet.as_view({'put':'read'})),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值