用 ModelViewSet 的多个查找字段替换默认 PK slug

问题描述

我有两个 slug,我可以针对它们运行查询。感谢基类 MultipleFieldLookupMixin,我的视图类继承自它,因此允许我拥有多个 lookup_fields

我们知道当 ModelViewSetDefaultRouter 一起使用时,在 URL 末尾附加一个 pk这是我不想要的

例如,当我这样做时:

router = DefaultRouter()
router.register(r'organization',OrganizationModelViewSet,basename='organization')


urlpatterns = [
    path('viewset/<str:device>/<str:start_time>/',include(router.urls))
]

它给了我网址

mydomain.com/viewset/<str:device>/<str:start_time>/organization/<int:pk>/

最后我不想要这个 pk。如果我们可以删除 organization,那就更好了。我希望端点是,

mydomain.com/<str:device>/<str:start_time>/

更多的玩耍,我了解到在我的 extra_kwargs 类中添加这样的 serializer

    extra_kwargs = {
        'url': {'lookup_field': 'start_time'}
    }

修改视图类中的lookup_fields,使用单数查找字段,例如lookup_field,使用值比方说start_time,如图所示

lookup_fields = ["device","start_time"]

lookup_field = "start_time"

并通过删除 start_time slug 相应地修改 URL,然后 URL 变为

mydomain.com/viewset/<str:device>/organization/<str:start_time>/

lookup_field 修改单数 start_time 显然可以或多或少地为我们提供所需的 URL,但没有完成工作,因为我们现在只有一个 lookup_field!

如果我们编辑这一行

router.register(r'organization',DeviceActivityModelViewSet,basename='device_activity')

router.register(r'',basename='device_activity')

然后我们得到网址

mydomain.com/viewset/<str:device>/<str:start_time>/

这正是我想要的,但正如我所说,它不起作用,因为只有一个查找字段。

切入正题,我希望它能澄清我对此的研究,并重申我想要拥有此 URL 端点的问题陈述

mydomain.com/<str:device>/<str:start_time>/

带有两个 slug,无需更改我视图的基类,即 ModelViewSet。我知道使用 GenericAPIView 可以轻松实现我想要的功能,而且我也已经做到了,但我很好奇如何以这种方式实现。

解决方法

因为我不需要完整查看您的代码,所以我认为下面的代码片段应该适合您。

urlpatterns = [
    path('/<str:device>/<str:start_time>/',include(router.urls))
]

如果它不起作用,请告诉我