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

posted @ 2020-11-02 20:52  小小程序员阿新  阅读(489)  评论(0编辑  收藏  举报

载入天数...载入时分秒...