视图集
视图集是一种将多个相关视图的逻辑组合到单个类中的方法。 换句话说,一个视图集可以替换多个视图。 当前,我们有四个视图:两个用于博客帖子,两个用于用户。 相反,我们可以使用两个视图集来模仿相同的功能:一个用于博客文章,另一个用于用户。
折衷方案是,对于不十分熟悉视图集的其他开发人员,可读性会有所下降。 所以这是一个权衡。当我们交换视图集时,代码在更新后的 posts/views.py
文件中是这样的。
# posts/views.py from django.contrib.auth import get_user_model from rest_framework import viewsets # new from .models import Post from .permissions import IsAuthorOrReadOnly from .serializers import PostSerializer, UserSerializer class PostViewSet(viewsets.ModelViewSet): # new permission_classes = (IsAuthorOrReadOnly,) queryset = Post.objects.all() serializer_class = PostSerializer class UserViewSet(viewsets.ModelViewSet): # new queryset = get_user_model().objects.all() serializer_class = UserSerializer
在顶部,而不是从 rest_framework 导入泛型,我们现在在第二行导入视图集。 然后,我们使用 ModelViewSet,它为我们提供了列表视图和详细信息视图。 而且,我们不再需要像以前一样为每个视图重复相同的 queryset 和 serializer_class 。
Routers 路由
直接与视图集一起使用,以自动为我们生成 URL 模式。 我们当前的 posts/urls.py
文件具有四个 URL 模式:两个用于博客文章,两个用于用户。相反,我们可以为每个视图集采用一条路由。 因此,使用两个路由而不是四个 URL 模式。 听起来更好吧?
Django REST Framework 具有两个默认路由器:SimpleRouter 和 DefaultRouter 。 我们将使用 SimpleRouter,但也可以为更多高级功能创建自定义路由器。
更新后的代码如下所示:
# posts/urls.py from django.urls import path from rest_framework.routers import SimpleRouter from .views import UserViewSet, PostViewSet router = SimpleRouter() router.register('users', UserViewSet, base_name='users') router.register('', PostViewSet, base_name='posts') urlpatterns = router.urls
在最上面一行,将导入 SimpleRouter 及其视图。 路由器设置为 SimpleRouter,我们为用户和帖子“注册”每个视图集。 最后,我们将 URL 设置为使用新路由器。
继续并立即检查我们的四个端点! 用户列表是相同的。
但是,局部视图有些不同。 现在它被称为“用户实例”,而不是“用户详细信息”,并且还有一个附加的“删除”选项内置于ModelViewSet中。
可以自定义视图集,但是一个重要的折衷是用视图集编写更少的代码,这是默认设置,它可能需要一些其他配置才能完全匹配您想要的内容。
转到发布列表,我们可以看到它是相同的:
重要的是,我们的权限仍然有效。 使用我们的 testuser2 帐户登录时,Post Instance 为只读。
但是,如果我们使用超级用户帐户(该日志是单独的博客文章的作者)登录的,那么我们将具有完整的读写-编辑-删除权限。
总结
视图集和路由器是一种强大的抽象,可减少开发人员必须编写的代码量。 但是,这种简洁性是以牺牲初始学习曲线为代价的。 最初几次使用视图集和路由器而不是视图和 URL 模式会感到很奇怪。
最终,何时向项目添加视图集和路由器的决定是相当主观的。 一个好的经验法则是从视图和 URL 开始。 随着 API 复杂性的增加,如果您发现自己一遍又一遍地重复相同的端点模式,那么请查看视图集和路由器。