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 无法识别我的 @action
s 在继承 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'
我的问题:
- 为什么
methods
被多次通过?
- 我该如何解决这个问题?
- 是否有更好的方法来实现跨多个 ViewSet 的一致、无重复的
@action
s?
问题是 @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
的专用版本。
我需要在多个 ViewSet 上使用类似的 @action
详细路线。我想确保它们保持一致。当我已经知道这些参数并且处理请求的方法在任何地方都相同时,我不想将 @action(methods=["post"], detail=True, url_path="something")
放在 20 个地方。
我第一次尝试解决 htis 是将方法及其装饰器放在基 class 中,并让我的 ViewSets 继承它,但是因为方法的装饰不是继承的,所以 DRF 无法识别我的 @action
s 在继承 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'
我的问题:
- 为什么
methods
被多次通过? - 我该如何解决这个问题?
- 是否有更好的方法来实现跨多个 ViewSet 的一致、无重复的
@action
s?
问题是 @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
的专用版本。