モデルでどのフィールドが変更されたかを追跡したいと思います(つまり、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 が実行されます。
私はこれをすべて間違った方法でやっていますか?実際に機能する簡単な方法はありますか?
ありがとう!