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