应用中使用详细视图和路由集
简介
事情变得复制之前,我们就应该将其进行抽象。
一步步攀爬
1 视图集 Viewsets
视图集是一种将多个相关视图的逻辑组合到单个类中的方法。
其他换句话说,一个视图集可以替换多个视图。
比如,这里有四个视图:两个用于博客文章和两个给用户。
我们可以使用两个视图集来模仿相同的功能:一个用于博客和一个供用户使用.代码如下 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
它既提供了列表视图又提供了为我们提供详细视图。
而且我们不再对于每个视图都重复相同的queryset和serializer_class。
现在服务停止了,因为缺少路由。 接下来配置路由.
2 路由集 Routers
路由集直接与视图集一起使用,以自动为我们生成URL模式。
我们目前posts/urls.py文件具有四个URL模式:两个用于博客文章,两个用于用户。
我们可以 不用为每个视图集采用一条路线。
因此,使用两个路由而不是四个URL路由模式。
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, basename='users')
router.register('', PostViewSet, basename='posts')
urlpatterns = router.urls
重启服务,查看效果
python manager.py runserver 0.0.0.0:2000
可以看到现在称为“用户实例”而不是“用户详细信息”,并且内置了一个附加的“删除”选项到ModelViewSet。
可以自定义视图集,但这是一个重要的折衷,以换取更少的编写空间带有视图集的代码是默认设置,可能需要一些其他配置才能匹配您想要的。
但是,如果我们使用超级用户帐户(该博客文章的作者)登录,那么我们就拥有完整的读写编辑删除权限。
3 小结
视图集和路由器集是功能强大的抽象,可减少我们作为开发人员必须写的重复代码量,但是,这种简洁性是以牺牲初始学习曲线为代价的。
几次使用视图集和路由器,而不是视图和URL模式,这很奇怪,然后会感觉头疼。
因此,何时向项目添加视图集和路由器的决定是非常主观的。一个好的经验法则是从视图和URL开始。
如果发现项目API随着复杂性的增长而增长,自己一遍又一遍地重复相同的端点模式,然后查看是否可以使用视图集和路由器。否则在此之前,请保持简单。
- 点赞
- 收藏
- 关注作者
评论(0)