2

我有两个蛞蝓,我针对它们运行查询。感谢基类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_timeslug 相应地修改 URL,然后 URL 变为

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

用修改单数lookup_fieldstart_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我也做到了,但我很好奇如何做到这一点。

4

1 回答 1

1

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

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

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

于 2021-08-10T14:11:09.560 回答