• 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'})),
    ]
    该花的钱要花,该吃的饭要吃。
  • 相关阅读:
    新添61工程文件后无法编译问题
    beaglebone_black_学习笔记——(4)闪烁LED之shell命令
    PADS技巧——铺铜
    自定义map对象,用于再不支持es6的map的时候
    vue.js基础学习(2)
    vue.js基础学习(1)
    ie浏览器float兼容性
    webAPI路由的使用
    webAPI中使用log4net进行日志记录
    webAPI中使用FormsAuthenticationTicket作为登录权限票据
  • 原文地址:https://www.cnblogs.com/chao666/p/12284439.html
Copyright © 2020-2023  润新知