私が質問に答えるのを助けるためにこの投稿をすべて読む必要はありません。この投稿の残りの部分は質問が来た文脈だけですが、一般的な質問は次のとおりです。
Djangoの複数のモデルにまたがるビジネスロジックをどこに配置しますか?
いくつかの可能性:
- いくつかのビュー?(私はそうは思いません、それは管理者といくつかのビューで動作する必要があります、DRY)
- モデル/フォームにメソッドを保存しますか?(方法?)
- モデル/フォームのメトスをきれいにしますか?(どのように?)
- ロジックを分割して信号を使用しますか?(どのように?)
- 他の?
コンテクスト:
私はこのモデルを持っています:
- 部門:会社のさまざまな部門を参照します(リスク、財務、IT、...)
- 従業員:一定期間、1つの部門にのみ所属し、その後他の部門に異動する場合があります。
- プロジェクト:各部門は複数のプロジェクトを持つことができ、プロジェクトは複数の部門に属しています。
- メンバーシップ:join_dateやleave_dateなどの他のフィールドを含む、従業員と部門の多対多関係の中間テーブル。重要なフィールドはfk:Department、fk:Employeeです。
- 履歴:メンバーシップとプロジェクトの中間テーブル。どの従業員がウィッシュプロジェクトに関与していて、ある部門で働いていたのかを教えてくれます。重要なフィールドはfk:Membership、fk:Projectです。
- CurrentProjects:部門と現在取り組んでいるプロジェクトを関連付けるテーブル。
私がDjango管理者で、リスク部門に行き、リスクには現在Project1とProject2が割り当てられているとします。新しい従業員「JhonSmith」を追加し(たとえば、Departmentでインラインフォームを使用して)、保存ボタンを押すと、モデルの履歴が次の情報で更新されます。
メンバーシップテーブル(重要なフィールドのみ): pk部門の従業員join_dateleave_date 20リスクジョンスミスxxxxxxxx 履歴テーブル(重要なフィールドのみ): メンバーシッププロジェクト 20プロジェクト1 20プロジェクト2
つまり、新しい従業員が新しい部門に割り当てられるとき、その部門からのすべての実際のプロジェクトは、テーブル履歴のそのメンバーシップ従業員部門に割り当てられる必要があります。
問題は、このロジックをDjangoのどこに配置するかです。このロジックには複数のモデルが含まれていることがわかるように、いくつかの可能性は次のとおりです。
- いくつかの見方では(私はそうは思わないが、それは管理者間期および他の場所で機能しなければならない)
- メンバーシップ、部門、または従業員のモデル/フォームのクリーンな方法では?
- メンバーシップ、部門、または従業員のモデル/フォームの保存方法では?
- ロジックを分割してシグナルのようなものを使用する必要がありますか?(いくつかの例?)
- その他?
- 私はすべてを複雑にしすぎていますか?=)
考慮事項:コードがプロセスの任意の時点でvalueerrorを生成し、ユーザー/管理者がこのエラーを無制限の形式で確認できると便利です。