DRF框架之视图集(ModelViewSet)简介

Posted chao666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF框架之视图集(ModelViewSet)简介相关的知识,希望对你有一定的参考价值。

DRF框架中,一共有三个视图集类,我们这里只说明ModelViewSet一个。

ModelViewSet是封装度最高的DRF的视图类。包含了怎删改查中的所有接口操作。

它继承自GenericViewSet、ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

所以,在使用ModelViewSet定义API时,我们只需要套用模板即可。

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

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

视图集类不再实现get()、post()、put()、delete()方法,而是实现动作 action。 如 list()、retrieve()、create()、update()、destory()

模板代码:

class BookInfoViewSet(ModelViewSet):
    """增删改查图书信息"""

    # 指定查询集
    queryset = BookInfo.objects.all()
    # 指定序列化器
    serializer_class = BookInfoModelSerializer

当我们,定义好了API视图后,我们需要在路由中,将请求方法与action进行绑定。

路由代码:

urlpatterns = [
    url(r^books/$, views.BookInfoViewSet.as_view({get:list})),
    url(r^books/(?P<pk>d+)/$, views.BookInfoViewSet.as_view({get:retrieve})),
]

通过,以上讲解,我们发现使用ModelViewSet定义API时,非常的方便,只需要几行代码即可。

但是,DRF框架提供的action根本不能满足,我们客户的奇葩需求,那么,我们需要进行自定义action。

自定义action:

自定义action很简单,其实,我们只需要在,使用ModelViewSet定义的api类中,自定义action函数后,再将自定义的函数在路由中绑定即可。

自定义action代码:

    def 名称(self, request):
        ‘‘‘
        自定义action
        :return: JSON数据
        ‘‘‘
        pass

路由代码:

urlpatterns = [
    url(r^books/$, views.BookInfoViewSet.as_view({get:action名称})),
]

案例代码:

class BookInfoListAPIView(ModelViewSet):
    ‘‘‘使用ModelViewSet定义API
    添加数据
    ‘‘‘

    # 设置查询集
    queryset = BookInfo.objects.all()
    # 设置序列化器类
    serializer_class = BookInfoModelSerializer
    
    def latest(self, request):
        ‘‘‘获取最后一条记录‘‘‘
        
        # 获取模型数据
        book = BookInfo.objects.latest(id)
        
        # 获取序列化器对象
        s = BookInfoModelSerializer(instance=book)
        
        return Response(s.data)

案例路由代码:

urlpatterns = [
    url(r^books/$, views.BookInfoListAPIView.as_view({get:latest})),
]

 

以上是关于DRF框架之视图集(ModelViewSet)简介的主要内容,如果未能解决你的问题,请参考以下文章

使用DRF视图集时自定义action方法

DjangoREST_Framework框架——视图集ViewSet和ModelViewSet源码解析

如何将两个不同的ListAPIView转换为单个ModelViewSet

Django REST framwork-06-使用 ViewSets 视图集和 Routers 路由

DRF 认证权限限流分页过滤序列化

09.ModelViewSet