Django休息框架嵌套视图集和路由

时间:2014-05-05 15:33:11

标签: django django-rest-framework

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

基本上是:

class TaskView(viewsets.ModelViewSet):
    model = Task

这很好,并且它已映射到task/网址,因此task/1/会提供ID为1的任务数据。现在,我想创建instance任务,对于任务有CRUD操作,所以我想要

class InstanceView(viewsets.ModelViewSet):
        model = Instance

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

有两个插件用于实现此目的:drf-nested-viewsetsdrf-nested-routers

DRF嵌套路由器在路由器级别上工作,并且可以轻松地执行嵌套视图集,因为嵌套参数会传递到每个方法中以便于参考。存储库中的README概述了可以执行的操作。这似乎不允许嵌套的DefaultRouters(包括API根页)。

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

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

注意:如果您不需要超链接关系,只需覆盖get_queryset并过滤掉url参数,就可以在没有第三方插件的情况下完成此操作。