我可以嵌套 View 集并创建需要 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
但是使用它们我失去了由框架制作的一切的力量。
最佳答案
有两个插件可以实现这一点:drf-nested-viewsets和 drf-nested-routers .
DRF 嵌套路由器在路由器级别上工作,并且可以轻松执行嵌套 View 集,因为嵌套参数被传递到每个方法中以便于引用。存储库中的 README 概述了可以执行的操作。这似乎不允许嵌套的 DefaultRouters(包括 API 根页面)。
DRF 嵌套 View 集(完全公开:由我创建)主要用于超链接场景(所有内容都使用 HyperlinkedModelSerializer)并且不是那么容易使用。它通过映射当前 URL 参数以在链接模型上生成嵌套 url 来处理超链接关系。可在 the original gist 获得一些文档。 .
这两个插件都需要覆盖 get_queryset
用于过滤嵌套查询集。对于 DRF 嵌套 View 集,这需要从 self.kwargs
中提取 url 参数。在 View 集中并使用它们进行过滤,我不确定它是如何使用 DRF 嵌套路由器完成的,但它很可能没有太大不同。
注:如果您不需要超链接关系,只需覆盖 get_queryset
即可在没有第三方插件的情况下完成此操作。并过滤掉 url 参数。
关于Django rest 框架嵌套的 View 集和路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23476342/