1

DB の何かが変更されたときに一部のユーザーに通知する必要がある状況があります。私の考えは、何らかの種類の差分をキャッチpre_saveして通知し、それをメールで送信することです。post_save通常はうまく機能しますが、m2m フィールドの差分を取得する方法がわかりません。

現時点では、次のようなものがあります。

def pre_save(sender, **kwargs):
    pk = kwargs['instance'].pk
    instance = copy.deepcopy(sender.objects.get(pk=pk))
    tracking[sender] = instance

def post_save(sender, **kwargs):
    instance = copy.deepcopy(kwargs['instance'])
    print diff(instance, (tracking[sender])) # TODO: don't print, save diff somewhere

Diff 関数はすべてのモデルで機能するはずです (現時点では 4 つのモデル クラスがあります)。deepcopy を使用すると、古いモデルを保存できますが、m2m フィールドは別のテーブルにあるため、保存する方法がわかりません (はい、このデータを取得できることはわかっていますが、実行の瞬間にはどのフィールドかわかりません) m2m であり、モデルごとに異なるスロットを作成したくありません)。私が望むのは一般的な解決策であるため、通知部分について考えずに後でモデルを追加することができます。

私の計画は、スロットが生成した差分を消去するために、ビューの後にget_data()関数clear_data()を呼び出すことです。save()

これはこれを行う良い方法ですか?より良い方法はありますか?私のためにこの仕事をすることができるdjangoアプリケーションはありますか?

すみません、英語は私の母国語ではありません。

4

1 に答える 1

6

まず、これには deepcopy を使用する必要はありません。データベースから送信者を再クエリすると、「新しい」オブジェクトが返されます。

def pre_save(sender, **kwargs):
    pk = kwargs['instance'].pk
    instance = sender.objects.get(pk=pk)
    tracking[sender] = instance

クラスのすべての多対多フィールドのリストを取得し、現在のインスタンスに関連する値を確認できます。

for field in sender._meta.local_many:
    values = field.value_from_object(instance).objects.all()
    # Now values is a list of related objects, which you can diff
于 2009-09-02T12:51:15.903 に答える