总结
1.常用视图集父类
ViewSet 继承自APIView和ViewSetMixin,没有提供任何方法,
需要自己写
GenericViewSet 继承GenericAPIView和ViewSetMixin,
其中GenericAPIView提供了基础方法,可以直接搭配Mixin扩展类使用,所以我们选这个
ModelViewSet 继承GenericViewset,但同时也包括ListModelMixin、
CreateModelMixin等mixin扩展类1)视图集都是默认优先继承ViewSetMixin类,再继承一个视图类(GenericAPIView或APIView)
2)ViewSetMixin提供了重写的as_view()方法,继承视图集的视图类,配置路由时调用as_view()必须传入 请求名-函数名 映射关系字典
eg: url(r'^v5/books/$', views.BookGenericViewSet.as_view({
'get': 'my_get_list'})),
表示get请求会交给my_get_list视图函数处理
继承ViewSet实现增删改查
ViewSet,只要继承了这个,就实现了增删改查,但是要重写查询全部和详情。
最主要的就是路由的书写
"""以下是APIView的视图集"""
# class BookViewSet(ViewSet):
# """视图集"""
#
# def list(self, request): # 重写了查询全部
# qs = BookInfo.objects.all()
# serializer = BookInfoModelSerializer(qs, many=True)
# return Response(serializer.data)
#
# def retrieve(self, request, pk): # 重写了查询一个数据
# try:
# book = BookInfo.objects.get(id=pk)
# except BookInfo.DoesNotExist:
# return Response(status=status.HTTP_404_NOT_FOUND)
#
# serializer = BookInfoModelSerializer(book)
# return Response(serializer.data)
路由
# ViewSet视图集指定路由
# 列表视图的路由GenericAPIView
url(r'^books/$', views.BookViewSet.as_view({
'get': 'list'})),
# 详情视图的路由GenericAPIView
url(r'^books/(?P<pk>\d+)/$', views.BookViewSet.as_view({
'get': 'retrieve'})),
继承GenericViewSet实现增删改查
class BookViewSet(ModelViewSet):
"""视图集"""
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
路由
router = SimpleRouter() # 创建路由器(路由器只能结束视图集一起使用)
# 默认只为标准了增删改查行为生成路由信息,如果想让自定义的行为也生成路由需要在自定义行为上用
# action装饰进行装饰
router.register(r'books', views.BookViewSet) # 注册路由
urlpatterns += router.urls # 把生成好的路由拼接到urlpatterns
以上就可以实现增删改查