django模型的状态机

django-states2的Python项目详细描述


Build Status

说明

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绑定 图形:pygraphvizyapgvb

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
由于测试失败,java testcontainers maven构建失败   java实现jacobi算法实现laplace方程   java中的多线程:如何在不等待所有线程使用ExecutorService完成任务的情况下终止所有线程的执行?   java Hello World不在Android Studio 3中工作   ubuntu Tomcat7的Java版本不正确   java Javafx内存泄漏   对于手动实现的Spring数据存储库方法,我应该使用Java8默认方法吗?   googleappengine中的java添加过滤查询   html当使用JSOUP库在Java中读取标签时,如何保留标签(如<br>、<ul>、<li>、<p>等)的含义?   编码为什么jasper生成的报告在Java中不显示西里尔语(保加利亚语)?   java有没有办法隐藏当前位置和jdk动作?   java找出编译原型文件的版本   有没有办法在运行时更改java方法的访问修饰符?   语法字符串。。。Java中的参数   java数组元素在添加其他元素时会相互覆盖   eclipse中的java GWT项目   java如何为spring rest模板请求将动态json属性名映射到jackson   java无法在Windows 10上找到特定的JDK   在xml字符串和java字符串之间提取正则表达式子字符串