1

単一アカウント モデルの Django アプリがあります。これをマルチアカウントに変換しているため、ほぼすべてのモデルにForeignKey(Account).

Accountそれぞれ(各アカウントが独自のサブドメインにある) が独自のデータのみにアクセスできるようにする最も簡単な方法は何ですか? サブドメインを設定するミドルウェアと、リクエストごとに現在のアカウントがあります。

filter(...., account = request.account)すべてのビューにa を追加することで、これを難しい方法で行うことができます。これは望ましくないため、

  1. filter(...., account = request.account)すべてのクエリ に追加されるため、これはドライではなく、繰り返しが多く、エラーが発生しやすくなります。
  2. より大きなリスクは、欠落しているフィルターがある場合であり、どこでもセキュリティ リスクです。
4

5 に答える 5

2

特に、すべてのクエリをアカウントでフィルタリングする必要がないことを考えると、明確な勝者はいないと思います。また、古いthreadlocalsトリックは信頼できないと見なされていることも考慮してください。つまり、フィルターパラメーターの自動挿入を行う唯一の方法は、ミドルウェアを使用することだと思います...しかし、それも信頼できず、複雑に思えます。

また、ここで役立つクエリ マネージャーを作成する良い方法も思いつきませんでしたが、可能かもしれません。

したがって、「マルチテナント」データベースの最善の解決策は、すべてのクエリがアカウントでフィルター処理されるようにすることだと思います。これは次の方法で実行できます。

  • ミドルウェアなどのデバッグ モード ミドルウェア: 所有権の記録スクリーナー

  • テストでは、テストによって生成された sql をチェックし、アカウント フィールドがクエリに含まれていることを確認します。テストフィクスチャに「他のアカウント」データを含めて、テストがクエリ結果に表示されないようにすることもできます。

  • コードレビュー中にすべてのクエリがフィルターでチェックされていることを確認する

確かにきれいではありませんが、これまでにできた中で最高です。

于 2009-12-03T16:34:02.810 に答える
1

うわー、私はまったく同じ問題を抱えています。これが私が得た最良の答えです:

Django: この大きなモデル / マネージャー / デザインの混乱をどのように整理しますか?

于 2010-01-25T22:12:24.790 に答える