django模型的状态机
django-states2的Python项目详细描述
说明
Django型号的状态引擎。为模型定义状态图,然后 记住每个物体的状态。状态转换可以记录为 物体。
安装
pip install django-states2
用法示例
要使用状态机,应在模型中添加状态字段
fromdjango_states.fieldsimportStateFieldfromdjango_states.machineimportStateMachine,StateDefinition,StateTransitionclassPurchaseStateMachine(StateMachine):log_transitions=True# possible statesclassinitiated(StateDefinition):description=_('Purchase initiated')initial=Trueclasspaid(StateDefinition):description=_('Purchase paid')defhandler(self,instance):code_to_execute_when_arriving_in_this_state()classshipped(StateDefinition):description=_('Purchase shipped')# state transitionsclassmark_paid(StateTransition):from_state='initiated'to_state='paid'description='Mark this purchase as paid'classship(StateTransition):from_state='paid'to_state='shipped'description='Ship purchase'defhandler(transition,instance,user):code_to_execute_during_this_transition()defhas_permission(transition,instance,user):returntrue_when_user_can_make_this_transition()classPurchase(StateModel):purchase_state=StateField(machine=PurchaseStateMachine,default='initiated')...(otherfieldsforapurchase)
如果启用了log_transitions,则会创建另一个模型。一切 应与南部的迁移兼容。
注意:如果要在中创建DataMigrationSouth,记得用 obj.save(no_state_validation=True)
用法示例:
p=Purchase()# Will automatically create state object for this purchase, in the# initial state.p.save()p.get_purchase_state_info().make_transition('mark_paid',request.user)# User parameter is optionalp.state# Will return 'paid'p.get_purchase_state_info().description# Will return 'Purchase paid'# Returns an iterator of possible transitions for this purchase.p.get_purchase_state_info().possible_transitions()# Which can be used like this..[x.get_name()forxinp.possible_transitions]
为了获得更好的过渡控制,覆盖:
- has_permission(self, instance, user):检查此用户是否 允许进行此转换。
- handler(self, instance, user):在此期间要运行的代码 过渡。当这里出现异常时,转换 不会被制造。
获取处于特定状态的所有对象:
Purchase.objects.filter(state='initiated')
验证
您可以添加一个需要通过的测试,然后才能进行状态转换 执行。好吧,你可以根据当前用户添加2:1 (has_permission)和一个泛型(validate)。
因此,对于StateTransition-对象,需要指定一个额外的 validate函数(签名是validate(cls, instance))。这个 应该产生TransitionValidationError,这样您就可以返回 在转换发生之前,需要传递的多个错误。
has_permission函数(签名 has_permission(transition, instance, user))应该检查 允许给定用户进行转换。例如,超级用户可以 缓和所有评论,而其他用户只能缓和对 他们的博客文章。
组
有时你想把几个州组合在一起,因为 查看(或其他内容)哪种状态无关紧要 是。我们支持两个不同的州组织,包括 独家(除此之外的所有产品):
classis_paid(StateGroup):states=['paid','shipped']classis_paid(StateGroup):exclude_states=['initiated']
状态图
您可以通过运行^{tt14}获得状态图$ 管理指挥部。
python manage.py graph_states myapp.Purchase.state
这需要graphviz和python绑定 图形:pygraphviz和yapgvb。