代码之家  ›  专栏  ›  技术社区  ›  saran3h

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

  •  0
  • saran3h  · 技术社区  · 8 年前

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

    @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中声明的参数。如果我移走它我可以运行它 by=无 从make_active函数,但我不能这么做,因为它是一个重要的参数。

    请帮忙。

    1 回复  |  直到 8 年前
        1
  •  1
  •   saran3h    8 年前

    我知道怎么了。lambda自动获取方法的所有参数。by=None是dictionary类型,所以我必须在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)
    
    推荐文章