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

 

posted @ 2020-02-08 18:56  老王同鞋  阅读(3689)  评论(0编辑  收藏  举报