django模型的状态机

django-states3的Python项目详细描述


Build Status

说明

django模型的状态引擎。定义模型的状态图,然后 记住每个对象的状态。可以记录的状态转换 物体。在

安装

pip install django-states3

使用示例

要使用状态机,应该向模型添加一个状态字段

^{pr2}$

如果启用了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))应该检查 允许给定用户进行转换。E、 超级用户可以 缓和所有评论,而其他用户只能缓和评论 他们的博客文章。在

有时你想把几个州组合在一起,因为 查看(或其他内容)在哪种状态下并不重要 是。我们支持2个不同的州组,包括(仅限于这些)或 独家(除此之外的所有产品):

classis_paid(StateGroup):states=['paid','shipped']classis_paid(StateGroup):exclude_states=['initiated']

状态图

您可以通过运行^{tt14}获得状态图$ 管理指挥部。在

python manage.py graph_states myapp.Purchase.state

这需要graphviz和python绑定 graphviz:pygraphvizyapgvb。在

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

推荐PyPI第三方库


热门话题
JavaGWT:何时使用Lazydemelement?   Java中跟踪消失线程的多线程处理   java Springboot未能配置数据源:“url”,但我没有使用数据库   java为按钮生成随机位置   math Java:包含二项式系数计算的表达式   java通过AsyncTask传递参数   从路径错误创建java文件   高流量网站的性能播放框架、Java、Apache、PostgreSQL、JPA和Hibernate   java将4D矢量转换为长矢量   arraylist Java循环在没有任何错误的情况下终止   java正在制作一个计算器应用程序,希望在第二个片段中更新历史,但无法完成   java将信息从IntentService发送到Activity   java如何在游戏中插入大量实体!工作   javascript如何在ScriptEngineforJava中从数学中获得准确的结果?