如何解决用 ModelViewSet 的多个查找字段替换默认 PK slug
我有两个 slug,我可以针对它们运行查询。感谢基类 MultipleFieldLookupMixin
,我的视图类继承自它,因此允许我拥有多个 lookup_fields
。
我们知道当 ModelViewSet
与 DefaultRouter
一起使用时,在 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))
]
如果它不起作用,请告诉我
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。