应用中使用详细视图和路由集

举报
码乐 发表于 2024/04/03 08:13:25 2024/04/03
【摘要】 简介事情变得复制之前,我们就应该将其进行抽象。一步步攀爬 1 视图集 Viewsets视图集是一种将多个相关视图的逻辑组合到单个类中的方法。其他换句话说,一个视图集可以替换多个视图。比如,这里有四个视图:两个用于博客文章和两个给用户。我们可以使用两个视图集来模仿相同的功能:一个用于博客和一个供用户使用.代码如下 posts/views.py: from django.contrib.aut...

简介

事情变得复制之前,我们就应该将其进行抽象。

一步步攀爬

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随着复杂性的增长而增长,自己一遍又一遍地重复相同的端点模式,然后查看是否可以使用视图集和路由器。否则在此之前,请保持简单。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。