【问题标题】:Django rest framework nested viewsets and routesDjango rest 框架嵌套视图集和路由
【发布时间】:2014-05-05 15:33:10
【问题描述】:

我可以嵌套视图集并创建将pk 作为url 参数的路由吗?

基本上:

class TaskView(viewsets.ModelViewSet):
    model = Task

这工作正常,它被映射到task/ url,所以task/1/ 给出了 id 为 1 的任务的数据。现在,我想创建一个任务的instance,具有 CRUD 操作任务,所以我想要

class InstanceView(viewsets.ModelViewSet):
        model = Instance

映射到task/{pk}/instance,其中pk 是任务的ID。

我该怎么做?是否可以? PS:我看到有@action@link,但是使用它们我失去了框架制作所有东西的力量。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    DRF extensions 还提供了一种创建嵌套路由的方法。

    【讨论】:

      【解决方案2】:

      有两个插件可以实现这一点:drf-nested-viewsetsdrf-nested-routers

      DRF 嵌套路由器在路由器级别上工作,并且使嵌套视图集变得容易,因为嵌套参数被传递到每个方法中以便于参考。存储库中的 README 概述了可以做什么。这似乎不允许嵌套 DefaultRouters(包括 API 根页面)。

      DRF 嵌套视图集(完全公开:由我创建)主要用于超链接场景(其中所有内容都使用 HyperlinkedModelSerializer)并且不那么容易使用。它通过映射当前 URL 参数以在链接模型上生成嵌套 url 来处理超链接关系。 the original gist 提供了一些文档。

      这两个插件都需要覆盖 get_queryset 来过滤嵌套查询集。对于 DRF 嵌套视图集,这需要从视图集中的 self.kwargs 提取 url 参数并使用这些参数进行过滤,我不确定使用 DRF 嵌套路由器是如何完成的,但它很可能没有太大不同。

      注意:如果您不需要超链接关系,这可以通过覆盖get_queryset 并过滤掉url 参数来完成,而无需第三方插件。

      【讨论】:

      • 我明白了,所以我必须使用插件。但是在孩子身上,我怎么能启动引用主父亲的领域。例如,我有 instance.task,我怎样才能将其设置为 url 之一?我必须覆盖 pre_save()?
      • 也求问,NestedViewSet中的一个怎么能得到父对象的对象,我在kwargs中没有找到pk,还是我遗漏了什么?
      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      相关资源
      最近更新 更多