没有 PK 的 Django REST Framework 嵌套路由

Posted

技术标签:

【中文标题】没有 PK 的 Django REST Framework 嵌套路由【英文标题】:Django REST Framework nested routes without PK 【发布时间】:2017-04-19 15:07:17 【问题描述】:

我想实现这样的路由:

/items - list of all items.
/items/types - list of all item types

我正在查看 drf-nester-routs,但嵌套 url 期望 pk 被传递。有什么好方法可以实现我想要的吗?

【问题讨论】:

【参考方案1】:

如果你不需要pk,那么你的路由应该是/types 而不是/items/types

您可能需要看看这个关于 REST 嵌套资源的 SO 问题:

What are best practices for REST nested resources

【讨论】:

现在就是这样实现的。但我认为将类型设置为项目的子 url 更合乎逻辑,因为它们是项目的类型,没有别的。 如果它们是项目类型(项目的子资源),则意味着您需要添加pk。如果我理解你需要的是/types 而不是/items/<pk>/types【参考方案2】:

ID为/items/1/types的意思是“显示属于ID为1的项目的所有类型”。而/items/types 并没有真正的意义,因为资源类型不能属于所有项目资源。

但是,您可以使用 @list_route 装饰器将其实现为 ViewSet 的自定义操作,例如

class MyViewSet(viewsets.ModelViewSet):
    ...
    @list_route()
    def types(self, request):
        return Response(some_way_to_list_types())
    ...

不过,这可能不是一种 RESTful 方式。

Docs on custom ViewSet actions

【讨论】:

以上是关于没有 PK 的 Django REST Framework 嵌套路由的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest-Framework 嵌套序列化器顺序

在 Django Rest 框架 URL 中通过唯一 ID 但不是 PK 获取详细信息

Django rest framework (视图类详解)

Django Rest Frame API:ModelSerializer 中的附加字段

我需要显示与相同模型有多对多关系的相关字段。 Django Rest Frame工作

如何修复 Reactjs、Django、Django Rest Frame 工作项目中的“net::ERR_CONNECTION_REFUSED 和错误:网络错误”错误