我有两个蛞蝓,我针对它们运行查询。感谢基类MultipleFieldLookupMixin
,我的视图类继承自基类,因此允许我拥有多个lookup_fields
.
我们知道当ModelViewSet
使用 with时DefaultRouter
,会在 URL 的末尾附加 apk
,这是我不想要的。
例如,当我这样做时:
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'', DeviceActivityModelViewSet, basename='device_activity')
然后我们得到网址
mydomain.com/viewset/<str:device>/<str:start_time>/
这正是我想要的,但正如我所说,它不起作用,因为单个查找字段。
切入正题,我希望它能澄清我对此的研究,并重申我想要拥有这个 URL 端点的问题陈述
mydomain.com/<str:device>/<str:start_time>/
.
有两个蛞蝓,没有改变我的观点的基类,即ModelViewSet
。我知道我想要的功能可以很容易地完成,GenericAPIView
我也做到了,但我很好奇如何做到这一点。