2009-09-02 11 views
1

私は、DBの内容が変更されたときに何人かのユーザーに通知する必要がある状況があります。私の考えはpre_savepost_saveシグナルをキャッチして、ある種のdiffとメールを作成することです。一般的にはうまくいきますが、m2mフィールドの差分を取得する方法はわかりません。差分関数は(私は4つのモデルクラスを持っているmommetで)すべてのモデルのために働く必要がありManyToManyフィールドのDiffangモデルオブジェクト

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 

:私はこのような何かを持っている瞬間

。 deepcopyでは古いモデルを保存できますが、m2mフィールドを別のテーブルに保存する方法はわかりません(はい、このデータを取得できますが、実行時にはどのフィールドがm2mと私はすべてのモデルのための異なるスロットを作成したくない)。私が望むのはジェネリックソリューションなので、後で通知部分を考えずにモデルを追加できます。

私の計画では、save()の後にget_data()clear_data()関数を呼び出して、スロットが生成したdiffを消去することを目指しています。

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

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

答えて

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 
関連する問題