• ModelViewSet


    ModelViewSet


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

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

    !!!!!注意,因为继承关系,必须在内部定义属性,queryset和serializer_class,因此,ModelViewSet通常结合ModelSerializer使用

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

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

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

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

    请求url对应方法备注
    get 127.0.0.1:8000/book/ list ListModelMixin
    get 127.0.0.1:8000/book/{1}/ retrieve …Mixin
    post 127.0.0.1:8000/book/ create …Mixin
    put 127.0.0.1:8000/book/{1}/ update …Mixin
    detete 127.0.0.1:8000/book/{1}/ destroy …Mixin
    get 127.0.0.1:8000/book/ user_action useraction 自定义
    post 127.0.0.1:8000/book/ user_action useraction 自定义
    #views中
    class BookInfoViewSet(ModelViewSet):
        """增删改查图书信息"""
    
        # 指定查询集
        queryset = BookInfo.objects.all()
        # 指定序列化器
        serializer_class = BookInfoModelSerializer
    
    

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

    from django.conf.urls import url
    from django.urls import path,include
    from . import views
    #导入路由控制类
    from rest_framework.routers import SimpleRouter,DefaultRouter
    
    #实例化路由控制对象
    router = DefaultRouter()
    #注册
    router.register(r'book',views.BookInfoViewSet)
    
    #编写路由,固定写法,不清楚是否还有其他写法
    urlpatterns = [
        url(r'',include(router.urls)),
    ]
    

    action(自定义方法)

    DRF框架提供的action根本不能满足某些无良老板的奇葩需求,这时候,就需要自定义action

    只需要在ModelViewSet定义的api类中,自定action函数后,再将自定义的函数在路由中绑定即可

    def 函数名(self, request):
            '''
            自定义action
            return: JSON数据
            '''
            pass
    
    #路由
    urlpatterns = [
        url(r'^books/$', views.BookInfoViewSet.as_view({'get':'action函数名'})),
    ]
    

    之后,使用http://127.0.0.1:8000/app01/books/进行测试

    或者使用装饰器方法:

    from rest_framework.decorators import action
    
    @action(methods=['get'],detail=False,url_path='bookw')
    def use(self,request):
    
        return Response({'name':'天听'})
    '''
    http://127.0.0.1:8000/app01/book/bookw/
    如果不加url_path,路由就成了http://127.0.0.1:8000/app01/book/use/
    '''
    

    注意,此写法不需要再注册路由,需要在装饰器内部进行定义
    url_path
    如果不定义url_path,路由默认为函数名

    detail=False表示不需要匹配主键的正则,函数不需要传入主键就设为False

  • 相关阅读:
    ExIco应用程序图标保存器1.0发布
    Object.defineProperty
    es6代理 proxy 学习
    node js学习记录
    css默认值列表
    关于 keyup keydown keypress
    转载一篇关于css选择器的,很透彻
    ......图片上传
    mimi
    css 开发心得
  • 原文地址:https://www.cnblogs.com/qx1996liu/p/13916434.html
Copyright © 2020-2023  润新知