djangoを使用してドメインレイヤーを整理するにはどうすればよいですか?
クエリを保持するカスタムマネージャーを作成できることはわかっていますが、仕様パターンのようなより柔軟なものが必要な場合はどうでしょうか。
Djangoに固有のドメインパターンはありますか?
私は現在、Djangoを使用する大規模なアプリケーションを設計していますが、ドメインレイヤーを正しく実行する方法を知りたいです。
djangoを使用してドメインレイヤーを整理するにはどうすればよいですか?
クエリを保持するカスタムマネージャーを作成できることはわかっていますが、仕様パターンのようなより柔軟なものが必要な場合はどうでしょうか。
Djangoに固有のドメインパターンはありますか?
私は現在、Djangoを使用する大規模なアプリケーションを設計していますが、ドメインレイヤーを正しく実行する方法を知りたいです。
この質問は少し主観的ですが、ここに私の 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)
私がそこで何をしたか分かりますか?:)