从django rest framework一路走来到这儿,我们视图至始至终都在继承APIView,现在我想让接口编写更简单,django rest framework中封装了很多类,可以让你的代码更简单,但功能却越强大。现在我把django rest framework强大的视图类分为了三个体系:

1、mixins体系(自动化实现增删改查,该体系是个裸功能,没有任何父类,仅仅是帮你编写了五个接口——增删改查查),一句话你只要继承了CreateModelMixin,只需要给出返回的数据和序列化类,不需要你编写post接口,但是视图只继承mixins体系是不行的,没有路由。
image.png
2、generics体系(这里面除了第一个类都继承了mixins中的功能,意思就是实现了接口但是接口没办法被访问。而第一个类就是为了做路由映射,所以其余类必须继承GenericAPIView来获得as_view的权利。因为View到APIView再到GenericAPIView都是单继承,所以有as_view功能的类最底层就是这个GenericAPIView,generics体系可以理解为让从mixins体系出来的接口能被访问)
image.png
3、viewsets体系自动生成路由,既然mixins体系是裸功能,证明肯定有个自动生成路由的体系,就是routers组件。这里你只需要看GenericViewSet这个类,它很牛逼,它就是用来自动生成路由的,既然这个路由能自动生成(只需要配置一点代码),所以generics体系是可以不使用的。
image.png
梳理:三个体系,你需要组合来继承定制你的接口功能。python是支持多继承,那到底怎样继承合适呢?如果你的接口要有增删改查接口就继承ModelViewSet(看上图,它除了增删改查查还继承了自动生成路由的GenericViewSet);如果你视图只完成增删接口,就可以混合双打,继承mixins体系里五个类中的CreateModelMixin和DestroyModelMixin,再搭配继承GenericViewSet,比如上图的ReadeOnlyModelViewSet就是它只要查(单个)查(所有)接口),然后自动生成这两个路由。

先继承generic体系的增删改查查的五个类:

  1. class GoodsView1(ListAPIView,CreateAPIView,RetrieveAPIView,DestroyAPIView,UpdateAPIView,):
  2. # 就继承这几个类,我就省去了自定义的四个接口
  3. authentication_classes = []
  4. permission_classes = []
  5. throttle_classes = [VisitLimit, ]
  6. queryset = Goods.objects.all() # 指明你的待序列化数据(默认是全部)
  7. serializer_class = GoodsSerializer # 指明你的序列化类

image.png
可以看到五个接口都在,我现在不使用 generic体系,我使用mixins体系加viewsets体系来自动生成路由:

  1. class GoodsView1(CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericViewSet):
  2. authentication_classes = []
  3. permission_classes = []
  4. throttle_classes = [VisitLimit, ]
  5. queryset = Goods.objects.all() # 指明你的待序列化数据(默认是全部)
  6. serializer_class = GoodsSerializer #

马上报错TypeError: The ’actions‘argument must be provided when calling ‘.asview()’ on a ViewSet. For example ‘.as view({‘get’: ‘list’})它说我们没有将get请求和list方法对应起来,原因是我们现在的所有接口是自动定义的,比如请求方法是post,get,内部调用的是create,list等方法,所以他要求我们在as_view里边用字典映射起来。现在我们开始用router自动生成路由。
可以在主路由也可以app中的路由。

  1. router = DefaultRouter()
  2. router.register(r'goods',views.GoodsView1)
  3. urlpatterns = [
  4. # 不要使用path,
  5. re_path(r'', include(router.urls),name='goods'),
  6. ]

image.png
这四个接口就是自动生成的。它生成的接口数,会自动判断你用的mixins体系中的哪几个接口,本例中我们全继承上了,所以有四个接口。

综上:

现在我们的接口可以简洁为:

  1. class GoodsView1(CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericViewSet):
  2. authentication_classes = []
  3. permission_classes = []
  4. throttle_classes = [VisitLimit, ]
  5. queryset = Goods.objects.all() # 指明你的待序列化数据(默认是全部)
  6. serializer_class = GoodsSerializer #

只需指明认证类,权限类,限流类,queryset(你要返回的所有数据集合),序列化类。其中前三个可以用全局配置的。局部可以取代全局。至于你想要哪些接口,你可以自己选择性继承mixins体系再继承一个GenericViewSet自动生成路由,而generic体系可以不用配合其他体系,但是需要手动配置url。