简介
本文档介绍了如何添加列出所有用户和单个用户的新端点,涉及创建新的序列化器、视图集和URL路由。首先,通过get_user_model
引用User模型并创建UserSerializer
。接着,在django中要从视图和URL切换到视图集,可以减少代码量,如在config/urls.py
中所示。
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项目中定义。
3 配置的过程
我们需要为每个端点定义视图。首先将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重构为视图集和路由器。