上篇文章我们讲到了ListCreateAPIView和RetrieveUpdateDestoryAPIView这种封装
但是我们还是写了重复代码,两个类都写了
queryset = Book.objects.all()
serializer_class = BookSerialize
我现在想能不能把这个也精简一下,全部的方法都放在一个类里面呢?
答案肯定是没问题的,但是要动一动我们的urls路由了
多的不说,上代码:
urls
url(r'books/$',views.BookView.as_view({'get':'list','post':'create'}),name="books"),
url(r'books/(?P<pk>\d+)/$',views.BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'}),name="books_filter"),
视图则使用继承viewsets的ModelSerializer类
class BookView(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerialize
序列化类还是使用继承自serializers.ModelSerializer的序列化类不变
然后就可以在一个视图中使用全部五种方法了
为什么这样做可以呢?
看一下源码:
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
源码中,他直接继承了全部的mixins视图组件和GenericViewSet
如果想进一步的了解其中的源码,下次再讲
给一张图片了解一下:
先来看一下运行效果,其他的就不给图片了,post来看一下
成功新增数据!!!!!