本文通过简单的例子比较了django状态管理扩展的使用,涵盖django-fsm,xworkflows,django_transitions以及参考
django-fsm 使用例子
https://github.com/viewflow/django-fsm
state = FSMField(
default=State.DRAFT,
verbose_name='Publication State',
choices=State.CHOICES,
protected=True,
)
@transition(field=state, source=[State.APPROVED, State.EXPIRED],
target=State.PUBLISHED,
conditions=[can_display])
def publish(self):
'''
Publish the object.
'''
email_the_team()
update_sitemap()
busta_cache()
django-fsm-admin
https://github.com/gadventures/django-fsm-admin
from fsm_admin.mixins import FSMTransitionMixin
class YourModelAdmin(FSMTransitionMixin, admin.ModelAdmin):
# The name of one or more FSMFields on the model to transition
fsm_field = ['state',]
readonly_fields = ['state', ]
admin.site.register(YourModel, YourModelAdmin)
xworkflows
https://github.com/rbarrois/xworkflows
import xworkflows
class MyWorkflow(xworkflows.Workflow):
# A list of state names
states = (
('foo', "Foo"),
('bar', "Bar"),
('baz', "Baz"),
)
# A list of transition definitions; items are (name, source states, target).
transitions = (
('foobar', 'foo', 'bar'),
('gobaz', ('foo', 'bar'), 'baz'),
('bazbar', 'baz', 'bar'),
)
initial_state = 'foo'
class MyObject(xworkflows.WorkflowEnabled):
state = MyWorkflow()
@xworkflows.transition()
def foobar(self):
return 42
# It is possible to use another method for a given transition.
@xworkflows.transition('gobaz')
def blah(self):
return 13
django_transitions
LiveStatus Status
class LiveStatus(StatusBase):
"""Workflow for Lifecycle."""
# Define the states as constants
DEVELOP = 'develop'
LIVE = 'live'
MAINTENANCE = 'maintenance'
DELETED = 'deleted'
# Give the states a human readable label
STATE_CHOICES = (
(DEVELOP, 'Under Development'),
(LIVE, 'Live'),
(MAINTENANCE, 'Under Maintenance'),
(DELETED, 'Deleted'),
)
# Define the transitions as constants
PUBLISH = 'publish'
MAKE_PRIVATE = 'make_private'
MARK_DELETED = 'mark_deleted'
REVERT_DELETED = 'revert_delete'
# Give the transitions a human readable label and css class
# which will be used in the django admin
TRANSITION_LABELS = {
PUBLISH : {'label': 'Make live', 'cssclass': 'default'},
MAKE_PRIVATE: {'label': 'Under maintenance'},
MARK_DELETED: {'label': 'Mark as deleted', 'cssclass': 'deletelink'},
REVERT_DELETED: {'label': 'Revert Delete', 'cssclass': 'default'},
}
# Construct the values to pass to the state machine constructor
# The states of the machine
SM_STATES = [
DEVELOP, LIVE, MAINTENANCE, DELETED,
]
# The machines initial state
SM_INITIAL_STATE = DEVELOP
# The transititions as a list of dictionaries
SM_TRANSITIONS = [
# trigger, source, destination
{
'trigger': PUBLISH,
'source': [DEVELOP, MAINTENANCE],
'dest': LIVE,
},
{
'trigger': MAKE_PRIVATE,
'source': LIVE,
'dest': MAINTENANCE,
},
{
'trigger': MARK_DELETED,
'source': [
DEVELOP, LIVE, MAINTENANCE,
],
'dest': DELETED,
},
{
'trigger': REVERT_DELETED,
'source': DELETED,
'dest': MAINTENANCE,
},
]
Model:
class Lifecycle(LifecycleStateMachineMixin, models.Model):
"""
A model that provides workflow state and workflow date fields.
This is a minimal example implementation.
"""
class Meta: # noqa: D106
abstract = False
wf_state = models.CharField(
verbose_name = 'Workflow Status',
null=False,
blank=False,
default=LiveStatus.SM_INITIAL_STATE,
choices=LiveStatus.STATE_CHOICES,
max_length=32,
help_text='Workflow state',
)
wf_date = models.DateTimeField(
verbose_name = 'Workflow Date',
null=False,
blank=False,
default=timezone.now,
help_text='Indicates when this workflowstate was entered.',
)
Admin
# -*- coding: utf-8 -*-
"""Example django admin."""
from django_transitions.admin import WorkflowAdminMixin
from django.contrib import admin
from .models import Lifecycle
class LifecycleAdmin(WorkflowAdminMixin, admin.ModelAdmin):
"""
Minimal Admin for Lifecycles Example.
You probably want to make the workflow fields
read only so yo can not change these values
manually.
readonly_fields = ['wf_state', 'wf_date']
"""
list_display = ['wf_date', 'wf_state']
list_filter = ['wf_state']
admin.site.register(Lifecycle, LifecycleAdmin)
参考