路由器的源码: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/,得到如下返回结果:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线