Django Rest Framework中的复合键?

时间:2015-09-02 10:31:09

标签: django rest django-models django-rest-framework

我一直在开发一个Django应用程序,用于跟踪多个网络环境中的VLAN使用情况,其他应用程序可以使用它来为新安装分配VLAN。

模型是层次结构:位置 - > VLANPool-> VLAN

因此,每个位置都有一个唯一的VLAN 100,它可以是不同池的成员,具体取决于位置。然后客户端应用程序可以说'#34;给我customer_networks中的下一个VLAN"池,然后对生成的VLAN执行各种操作 - 保留,重命名/注释,释放。

每个型号都有一个自动创建的ID'主键,但用户/ API客户端确实关心名称字段(池)或VLAN ID(vlan)。

通过为我的应用程序中的每个模型创建ModelViewSet和ModelSerializer,并使用路由器注册ViewSets,我得到了一个基本的REST API和Django REST Framework。但是,默认情况下使用pk,这对最终用户来说毫无意义。这对于可浏览的API来说很好,您只需点击结果,但我希望能够在不知道数据库ID的情况下构建URL。

我喜欢为了达到目标而需要编写的代码很少,但是为了达到这样的API架构,我需要更改的最小值是什么:

 {
    "cars": [
    "Nissan": [
        "Sentra": {"doors":4, "transmission":"automatic"},
        "Maxima": {"doors":4, "transmission":"automatic"}
    ],
    "Ford": [
        "Taurus": {"doors":4, "transmission":"automatic"},
        "Escort": {"doors":4, "transmission":"automatic"}
    ]
]}

也就是说,查找键是location.name和实际对象的名称字段的组合。

有人能指出我正确的方向吗?我想我需要更改Serializer上的查询集或创建一个新的Serializer,但URL构造怎么样?

我首先添加了lookup_field =' name'到我的ViewSets,然后路由器说它不能使用名称而不是id来解析URL(使用ID而不是获取404,所以它实际上将该名称识别为有效)。

2 个答案:

答案 0 :(得分:2)

您可以使用lookup_fields生成自定义网址。您可以在此处Multiple LookUp ArgsCustom Urls点击此链接。

答案 1 :(得分:0)

我遗漏的关键词是"嵌套路由器"或者"嵌套资源" - VLAN嵌套在location对象中。考虑资源而不是数据库使得这一点更加清晰。

此功能由drf-nested-routersdrf-extensions包提供。我将尝试使用drf-extensions,因为它看起来有点成熟(没有"这是WIP"顶部的横幅!)。