我正在使用django-fsm来实现状态机。代码看起来像
def user_ok_to_check_me( instance, user):
...
class Job( models.Model):
# ... many screenfulls of code
@transition( field=state, target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
def fail_checking(self, **kwargs):
...
,它正在工作。由于代码所属类之外的实用工具很少,因此代码的可读性受到了损害,所以我尝试了
class Job( models.Model):
# ... many screenfulls of code
@staticmethod
def user_ok_to_check_me( instance, user):
...
@transition( field=state, target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
def fail_checking(self, **kwargs):
这不起作用。不确定user_ok_to_check_me
现在做什么,它的行为就像一个无操作函数,即使它所做的只是return False
为什么?有没有办法在类中声明这个小功能? (使用lambda instance, user:
有点太长了)
答案 0 :(得分:0)
找到了答案,尽管我不确定我是否理解。
class Job( models.Model):
# ... many screenfulls of code
# @staticmethod #NO DECORATOR
def user_ok_to_check_me( instance, user):
...
@transition( field=state, target=BOOKING, source=CHECKING, permission=user_ok_to_check_me)
def fail_checking(self, **kwargs):
ok_to_check_me
中@transition
的使用发生在创建该类的代码的执行期间,而不是在其实例化期间。因此,它需要参考上面定义的实际功能。将@staticmethod
应用于该函数将其替换为其他任何东西,无论是什么,过渡修饰符都不可接受。
实例化该类时,该函数将绑定到实例。但是,这不会影响对@transition
已存储在其内部的函数的引用。在这种情况下,绑定是无害的,因为instance
和self
通常是指相同的绑定。在其他情况下,您可能想通过其__init__
方法从实例中删除意外绑定函数(或者只是大量文档,不要尝试将其用作对象方法)。