Django-fsm:由于额外的方法参数,动态目标失败

时间:2018-07-25 06:42:13

标签: python django lambda django-fsm

https://github.com/kmmbvnr/django-fsm#target docs中的原始示例:

@transition(
    field=state,
    source='for_moderators',
    target=GET_STATE(
        lambda self, allowed: 'published' if allowed else 'rejected',
        states=['published', 'rejected']))
def moderate(self, allowed):
    self.allowed=allowed

我正在使用以上方法来解析动态目标状态。我的功能如下:

@fsm_log_by
@transition(
    field=state,
    source=[constants.BookingState.on_hold],
    target=GET_STATE(
        lambda self: constants.BookingState.camop_assigned if self.camera_operator else constants.BookingState.active,
        states=[constants.BookingState.active, constants.BookingState.camop_assigned]),
    permission=can_make_active,
)
def make_active(self, by=None):
    async('some async task', self.pk)
    async('some other async task', self.pk)

我还有一个by=None,用于记录日志。但是,当我运行此函数时,它说:

<lambda>() got an unexpected keyword argument 'by'

我不明白为什么lambda会考虑甚至没有在lambda中声明的参数。如果我从make_active函数中删除了by=None,就可以运行它,但是我不能这样做,因为它是一个重要的参数。

请帮助。

1 个答案:

答案 0 :(得分:1)

我弄清楚出了什么问题。 lambda自动获取方法的所有参数。 by = None不是字典类型,因此我必须在lambda中指定** kwargs。

更新代码:

@fsm_log_by
@transition(
    field=state,
    source=[constants.BookingState.on_hold],
    target=GET_STATE(
        lambda self, **kwargs: constants.BookingState.camop_assigned if self.camera_operator else constants.BookingState.active,
        states=[constants.BookingState.active, constants.BookingState.camop_assigned]),
    permission=can_make_active,
)
def make_active(self, by=None):
    async('some async task', self.pk)
    async('some other async task', self.pk)