4

djangoを使用してドメインレイヤーを整理するにはどうすればよいですか?

クエリを保持するカスタムマネージャーを作成できることはわかっていますが、仕様パターンのようなより柔軟なものが必要な場合はどうでしょうか。

Djangoに固有のドメインパターンはありますか?

私は現在、Djangoを使用する大規模なアプリケーションを設計していますが、ドメインレイヤーを正しく実行する方法を知りたいです。

4

1 に答える 1

5

この質問は少し主観的ですが、ここに私の 2 セントがあります。

  • 複数のオブジェクトを同時に変更するためのビジネス ロジックは、一般にマネージャに配置する必要があります。
  • オブジェクトを作成するための特別なロジックはマネージャーにあるはずです。MyModel.objects.create_complex(foo, bar)
  • カスタム情報の計算、複雑なフィールドの更新などのビジネス ロジックは、モデルのメソッド (またはプロパティ) にある必要がありますmy_instance.get_accumulated_interest()。これらはモデルを保存せず、一部のフィールドのみを更新してから戻ります。
  • 情報を検証するためのビジネス ロジックはclean、モデルのメソッドに入れるかclean、特別なフォームのメソッドとして入れる必要があります。モデル上にあれば、システムのさまざまな部分からより簡単に再利用できます。
  • 一般に、理にかなったロジックを配置する場所が見つからない場合は、それらをビューに配置します。
  • オフライン処理はカスタム管理コマンドで行う必要があり、不要な影響を与えることなく、同じコマンドを同じ引数で複数回再実行できる必要があります。

「X に入れる必要がある」と言うとき、システムのこれらの部分は、Django とはまったく別のモジュールを呼び出す必要があることを意味します。これにより、これらの機能を個別にテストすることが容易になる場合があります。

編集:

「仕様パターン」については、マネージャー メソッドを呼び出してオブジェクトをフィルター処理する上位レベルのモジュールを作成することをお勧めします。Q オブジェクトを使用すると、次のように使用できる汎用フィルターを作成できます。

q = Q(field__isnull = False) | Q(otherfield__isnull = False)
objects = Model.objects.filter(q)

編集 II:

Python では非常に一般的なプログラミングが可能です。クラスと関数は第一級市民です。次の例を検討してください。

def HasFooBar(model_class):
    return list(model_class.objects.filter(somefield__contains = 'foobar'))

def BarHasBaz(model_class, arg):
    return list(model_class.objects.filter(somefield = arg))

objects = HasFooBar(MyModel) + BarHasBaz(OtherModel, baz)

私がそこで何をしたか分かりますか?:)

于 2010-11-28T15:26:40.020 に答える