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

举报
码乐 发表于 2024/04/02 18:27:03 2024/04/02
【摘要】 简介所谓视图集和路由集,它们源自MVC中的思想,在处理更多视图和路由时抽象了更高一层。它们是视图和URL之上的附加抽象层。首要的好处是单个视图集可以替换多个相关视图。而且路由集可以自动为开发人员生成网址。 1 视图集和路由集 Viewsets and Routersviewsets rest_framework 的api视图开发工具routers rest_framewo...

简介

所谓视图集和路由集,它们源自MVC中的思想,在处理更多视图和路由时抽象了更高一层。
它们是视图和URL之上的附加抽象层。

首要的好处是单个视图集可以替换多个相关视图。而且路由集可以自动为开发人员生成网址。

1 视图集和路由集 Viewsets and Routers

  • viewsets

         rest_framework 的api视图开发工具
    
  • routers

          rest_framework的 api 路由开发工具
    

如何从视图和URL切换到视图集?路由器可以实现相同的功能,而所需的功能要少得多代码。config/urls.py 现有的路由

 	admin/     
	api/ 
	api/auth/
	api/v1/
	api/v1/dj-rest-auth/
	api/v1/dj-rest-auth/registration/ 
	api/v1/dj-rest-auth/
	api/v1/dj-rest-auth/registration/

前两个端点是我们创建的,而dj-rest-auth提供了另外五个端点。

现在让我们添加两个附加端点以列出所有用户和单个用户。

2 步骤

传统的Django有一个内置的User模型类,我们在认证一章的前面的版本中已经使用过。因此,我们不需要创建新的数据库模型。

相反,我们只是需要连接新的端点。此过程始终涉及以下三个步骤

    新的 serializer 类
    新的 views 视图集
    为每个端点的新的 URL 路由集

修改serializers,添加新的 用户类, posts/serializers.py

	from django.contrib.auth import get_user_model # new
	from rest_framework import serializers
	from .models import Post
	class PostSerializer(serializers.ModelSerializer):
		class Meta:
			model = Post
			fields = ('id', 'author', 'title', 'body', 'created_at',)
	class UserSerializer(serializers.ModelSerializer): # new
		class Meta:
			model = get_user_model()
			fields = ('id', 'username',)

这里将使用了get_user_model来引用User模型,在Django中,实际上有三种不同的方式来引用User模型。

通过使用get_user_model,我们可以确保我们引用的是正确的用户模型,无论它是否是默认用户或自定义用户模型,通常在新的Django项目中定义。

然后,我们需要为每个端点定义视图。首先将UserSerializer添加到列表中。

最后 创建列出所有用户的UserList类和UserDetail类提供单个用户的详细视图。就像我们的帖子视图一样,在这里我们可以使用ListCreateAPIView和RetrieveUpdateDestroyAPIView。

我们还需要参考用户通过get_user_model进行建模,以便将其导入到第一行。

修改视图, posts/views.py

	from django.contrib.auth import get_user_model # new
	from .serializers import PostSerializer, UserSerializer 

	class UserList(generics.ListCreateAPIView): # new
            
		queryset = get_user_model().objects.all()
		serializer_class = UserSerializer
                    
	class UserDetail(generics.RetrieveUpdateDestroyAPIView): 
            
		queryset = get_user_model().objects.all()
		serializer_class = UserSerializer

”视图和“用户”视图都具有完全相同的queryset和serializer_class。也许可以通过某种方式将它们组合在一起保存代码。

修改 posts/urls.py 应用路由

urlpatterns = [path('users/', UserList.as_view()), 

		path('users/<int:pk>/', UserDetail.as_view()), # new
		...]

确保本地服务器仍在运行,并跳至可浏览的API.

	http://127.0.0.1:2000/api/v1/users/

3 小结

在具有多个端点的大型项目中,这意味着开发人员可以编写更少的代码。可以说,对于有经验的开发人员来说也更好理解。

这是一个共同的特征,在许多API开发中有这个需求,这将使我们更加清楚为什么将我们的视图和URL重构为视图集和路由器。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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