Integrations

Django integration

When used in a Django App, this library implements an auto-discovery hook similar to how Django’s built-in admin autodiscover.

This library attempts to import an statemachine or statemachines module in each installed application. Such modules are expected to register StateMachine classes to be used with the MachineMixin.

Hint

When using python-statemachine to control the state of a Django model, we advise keeping the StateMachine definitions on their own modules.

So as circular references may occur, and as a way to help you organize your code, if you put state machines on modules named as mentioned above inside installed Django Apps, these StateMachine classes will be automatically imported and registered.

This is only an advice, nothing stops you do declare your state machine alongside your models.

Example

Given this StateMachine:

# campaign/statemachines.py

from statemachine import StateMachine
from statemachine import State
from statemachine.mixins import MachineMixin


class CampaignMachineWithKeys(StateMachine):
    "A workflow machine"
    draft = State('Draft', initial=True, value=1)
    producing = State('Being produced', value=2)
    closed = State('Closed', value=3)
    cancelled = State('Cancelled', value=4)

    add_job = draft.to.itself() | producing.to.itself()
    produce = draft.to(producing)
    deliver = producing.to(closed)
    cancel = cancelled.from_(draft, producing)

Integrate with your model:

# campaign/models.py

from django.db import models

class Campaign(models.Model, MachineMixin):
    state_machine_name = 'campaign.statemachines.CampaignMachineWithKeys'
    state_machine_attr = 'sm'
    state_field_name = 'step'

    name = models.CharField(max_length=30)
    step = models.IntegerField()

See also

Learn more about using the MachineMixin.