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

Ess*_*eTi 9 django django-rest-framework

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

基本上:

class TaskView(viewsets.ModelViewSet):
    model = Task
Run Code Online (Sandbox Code Playgroud)

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

class InstanceView(viewsets.ModelViewSet):
        model = Instance
Run Code Online (Sandbox Code Playgroud)

映射到task/{pk}/instance,pk任务的id 在哪里.

我怎样才能做到这一点?可能吗?PS:我看到有@action,@link但使用它们我失去了拥有框架所有东西的力量.

Kev*_*own 8

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

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

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

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

注意:如果您不需要超链接关系,这可以在没有第三方插件的情况下通过覆盖get_queryset和过滤 url 参数来完成。


ybe*_*ana 8

DRF扩展还提供了一种创建嵌套路由的方法.