我可以嵌套视图集并创建以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
,但是使用它们我失去了框架所有东西的力量。
答案 0 :(得分:7)
DRF extensions还提供了一种创建嵌套路由的方法。
答案 1 :(得分:3)
有两个插件用于实现此目的:drf-nested-viewsets和drf-nested-routers。
DRF嵌套路由器在路由器级别上工作,并且可以轻松地执行嵌套视图集,因为嵌套参数会传递到每个方法中以便于参考。存储库中的README概述了可以执行的操作。这似乎不允许嵌套的DefaultRouters(包括API根页)。
DRF嵌套视图集(完全披露:由我创建)主要用于超链接场景(其中所有内容都使用HyperlinkedModelSerializer)并且不易于使用。它通过映射当前URL参数来处理超链接关系,以在链接模型上生成嵌套URL。 the original gist可以获得一些文档。
两个插件都需要覆盖get_queryset
来过滤嵌套查询集。对于DRF嵌套视图集,这需要从视图集中的self.kwargs
中提取url参数并使用这些参数进行过滤,我不确定如何使用DRF嵌套路由器完成它,但它很可能没有太大的不同。< / p>
注意:如果您不需要超链接关系,只需覆盖get_queryset
并过滤掉url参数,就可以在没有第三方插件的情况下完成此操作。