django プロジェクトに取り組んでいるときに、無限に車輪の再発明をしたくない場合は、必要なサードパーティ ライブラリが多数あります。途中でツリー構造、定期的/延期タスクを(格納するためのSQLクエリ(デバッグ・ツールバー、ジャンゴ・エクステンションからシルク、--print-SQL)、何かをデバッグするためのツールは、uswgiは持ってのcronのようなインターフェースを。EAVはまだありますjsonfield で置き換えることができますが、これらの非常に便利なものの 1 つですが、なぜかネット上であまり議論されていないのが FSM です.
データベース内のほぼすべてのレコードには、なんらかの状態があります。たとえば、コメントの場合、モデレーターによる公開/削除/削除が可能です。店舗でのご注文について ・発行・支払い・配送・返品など さらに、ある状態から別の状態への遷移は、多くの場合、コードに塗りつぶされており、その中にはビジネス ロジックが含まれており、テストで十分にカバーする必要があります (それでも必要ですが、基本的なことをテストすることは避けることができます。 「支払い済み」の状態になって初めて「払い戻し」状態に移行できます。
このような遷移をより宣言的に 1 か所で説明することは非常に論理的です。必要なロジックとアクセス検証とともに。
django-fsm ライブラリ テストのサンプル コードを次に示します。
class BlogPost(models.Model):
"""
Test workflow
"""
state = FSMField(default='new', protected=True)
def can_restore(self, user):
return user.is_superuser or user.is_staff
@transition(field=state, source='new', target='published',
on_error='failed', permission='testapp.can_publish_post')
def publish(self):
pass
@transition(field=state, source='published')
def notify_all(self):
pass
@transition(field=state, source='published', target='hidden', on_error='failed',)
def hide(self):
pass
@transition(
field=state,
source='new',
target='removed',
on_error='failed',
permission=lambda self, u: u.has_perm('testapp.can_remove_post'))
def remove(self):
raise Exception('No rights to delete %s' % self)
@transition(field=state, source='new', target='restored',
on_error='failed', permission=can_restore)
def restore(self):
pass
@transition(field=state, source=['published', 'hidden'], target='stolen')
def steal(self):
pass
@transition(field=state, source='*', target='moderated')
def moderate(self):
pass
class Meta:
permissions = [
('can_publish_post', 'Can publish post'),
('can_remove_post', 'Can remove post'),
]
これは、とりわけレスト API に最適です。状態間の遷移のエンドポイントを自動的に作成できます。たとえば、 request /orders / id / cancel は、ビューセットの完全に論理的なアクションのように見えます。そして、アクセスを確認するために必要な情報はすでにあります! また、管理パネルのボタン、およびワークフローで美しいチャートを描画する機能:) 視覚的なワークフロー エディターもあります。非プログラマーはビジネスプロセスを説明できます
より宣言的で一般的なコードを書くほど、信頼性が高まります。より少ないコード、より少ない重複、より少ないバグ。テストは一部ライブラリの作成者にシフトし、プロジェクト固有のビジネスロジックに集中できます。