save をオーバーライドすることをお勧めしますが、django.contrib.auth.User オブジェクトを使用していると思います。その場合、pre_save シグナルを使用してほぼ同じことを達成できます。
def manage_domains(signal,**kwargs):
if kwargs.has_key('instance'):
instance = kwargs['instance']
else: return
old_instance = User.objects.get(pk=instance.pk)
instance_categories = instance.categories.all()
for group in old_instance.groups.all():
if group not in instance_categories:
instance.groups.clear()
pre_save.connect(manage_domains, sender=User)
これは、効率的なソリューションにはほど遠いものです。ユーザーオブジェクトが保存されると、上記の変更がメモリ内のオブジェクトに加えられ、保存によってデータベース内のオブジェクトが上書きされます。オブジェクトの変更されていないバージョンが保存しようとしているものと一致するかどうかを確認するためにデータベースにヒットするだけでなく、データベース ヒットが必要な 2 つのカテゴリ セットをループするという問題が発生しました。ロードします。
ここで効率を改善する最善の方法は、ManyToMany フィールド マネージャー自体をサブクラス化することです。これは、単に事後の状態を比較するのではなく、メモリ内で発生する変更に注意を払うためです。ただし、これはもう少し複雑で、組み込みの User オブジェクトを破棄する必要があります。