likes
comments
collection
share

服务:使用django构建项目:视图集和路由集

作者站长头像
站长
· 阅读数 31

1 视图集和路由集 Viewsets and Routers

  • viewsets

         rest_framework 的api视图开发工具
    
    
  • routers

          rest_framework的 api 路由开发工具
    
    

它们是视图和URL之上的附加抽象层。首要的好处是单个视图集可以替换多个相关视图。而且路由器可以自动为开发人员生成网址。

如何从视图和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重构为视图集和路由器。

转载自:https://juejin.cn/post/7244537029374394428
评论
请登录