路由器的源码:retrieve方法获取需序列化的对象
优采云 发布时间: 2021-05-29 03:25路由器的源码:retrieve方法获取需序列化的对象
文章中涉及的示例代码已经更新到HelloGitHub-Team仓库[2]
一旦我们使用了视图集,并实现了HTTP请求对应的action方法(对应规则的描述见使用视图集的简化代码),在路由器中注册后,django-restframework会自动为我们生成对应的API接口。
到目前为止,我们只实现了GET请求对应的action-list方法,所以路由器只为我们生成了一个API,这个API返回的是文章资源列表。 GET请求也可以用于获取单个资源,对应的动作是retrieve。因此,我们只要在视图集中实现retrieve方法的逻辑,就可以直接生成API接口获取单个资源文章。
贴心的,django-rest-framework帮我们在mixins.RetrieveModelMixin中写了检索的逻辑,可以直接混入视图集:
class PostViewSet(
mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
):
serializer_class = PostListSerializer
queryset = Post.objects.all()
permission_classes = [AllowAny]
现在,路由会自动添加一个 URL 模式 /posts/:pk/,其中 pk 是 文章 的 id。访问该API接口获取指定文章 id的资源。
实际上,实现每个动作逻辑的混入类非常简单。以 RetrieveModelMixin 为例,我们来看看它的源码:
class RetrieveModelMixin:
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
retrieve 方法首先调用get_object 方法获取要序列化的对象。 get_object 方法通常基于以下两点过滤掉单个资源对象:
get_queryset方法返回的资源列表对象(或queryset属性,get_queryset方法返回的值优先)。 lookup_field 属性指定的资源过滤字段(默认为pk)。 django-rest-framework 使用该字段的值从 get_queryset 返回的资源列表中过滤出单个资源对象。 lookup_field字段的值会从请求的URL中抓取,所以你看到文章接口的url模式是/posts/:pk/,假设lookup_field被指定为title,url模式是/posts/ :title/, this 根据文章的标题,我们会得到一个文章资源。 文章详细的序列化器
<p>现在假设我们要获取id为1的文章资源,访问获取单个文章资源的API接口:10000/api/posts/1/,得到如下返回结果: