5

モデルでどのフィールドが変更されたかを追跡したいと思います(つまり、djangoやdjango-reversionがすでに行っているような管理/フォームレベルではなく、よりアトミックであるため、モデルレベルで監査します)。事前/事後保存/削除シグナルを使用して、任意のフィールドに対してそれを行うことができます。ただし、m2m フィールドでそれを行うには問題があります。

以下のコード サンプルでは、​​逆の関係であるため、ユーザー変更フォームで「custom_groups」m2m フィールドを定義します。たとえば、ユーザーが管理インターフェイスでフォームを保存すると、「custom_groups」フィールドに変更があるかどうかをログに記録したいと思います。

モデル:

from django.contrib.auth.models import User

class CustomGroup(models.Model):
    users = models.ManyToManyField(User, related_name='custom_groups')

モデルフォーム:

class CustomUserChangeForm(UserChangeForm):
    custom_groups = forms.ModelMultipleChoiceField(required=False, queryset=CustomGroup.objects.all())

m2m_changed シグナルを使用する際の問題は、代入演算子を使用して m2m フィールドが更新された場合に実際に何が変更されたかを確認できないことです。

user.custom_groups = self.cleaned_data['custom_groups']

これは、すべてのオブジェクトを手動で追加する前に、内部的に django が *custom_groups* に対して clear() を実行するためです。これにより、m2m フィールドで pre/post-clear が実行され、次に pre/post save が実行されます。

私はこれをすべて間違った方法でやっていますか?実際に機能する簡単な方法はありますか?

ありがとう!

4

1 に答える 1

12

同様の問題があり、解決できたと思います。m2m_changedをどのように使用しているかわかりませんが、models.pyにあり、次のようになっている必要があります。

signals.m2m_changed.connect(your_function, sender=CustomGroup.users.through)

ここで、その関数を含むsignals.pyファイルを作成すると、次のコードで、選択したオプションが出力されます。

def your_function(sender, instance, action, reverse, model, pk_set, **kwargs):
    if action == 'post_add':
        for val in pk_set:
            print val

これで、更新された値がわかりました。これで問題が解決することを願っています。

于 2011-03-29T07:19:06.530 に答える