Using partial() on DRF's @action gives TypeError: "multiple values for argument"

Using partial() on DRF's @action gives TypeError: "multiple values for argument"

我需要在多个 ViewSet 上使用类似的 @action 详细路线。我想确保它们保持一致。当我已经知道这些参数并且处理请求的方法在任何地方都相同时,我不想将 @action(methods=["post"], detail=True, url_path="something") 放在 20 个地方。

我第一次尝试解决 htis 是将方法及其装饰器放在基 class 中,并让我的 ViewSets 继承它,但是因为方法的装饰不是继承的,所以 DRF 无法识别我的 @actions 在继承 classes 中也是如此。方法得到继承,但装饰器不被继承。

所以,为了解决这个问题,我可以把 @action 放在任何地方,但这意味着它的论点在很多地方都是重复的。我不要那个。

为了避免重复,我试图通过使用部分应用程序来专门化 @action。这将给我一个自定义的 @action 装饰器,其参数在任何地方都是相同的。

这给我留下了这样的东西(示例代码):

specialised_action = partial(action, methods=["post"], detail=True, url_path="my-action-url")

class SomeViewSet(GenericViewSet):
    @specialised_action
    def action_handler(self, request, *args, **kwargs):
        print("do something")

但是它不起作用,我得到这个错误:

TypeError: action() got multiple values for argument 'methods'

我的问题:

  1. 为什么 methods 被多次通过?
  2. 我该如何解决这个问题?
  3. 是否有更好的方法来实现跨多个 ViewSet 的一致、无重复的 @actions?

问题是 @action 不是装饰器,它 returns 是装饰器。所以没必要用partial().

而不是:

specialised_action = partial(action, methods=["post"], detail=True, url_path="my-action-url")

只需执行:

specialised_action = action(methods=["post"], detail=True, url_path="my-action-url")

然后我得到了带有固定参数的 @action 的专用版本。