私は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)
これは、効率的なソリューションにも、近くではありません。何が起こるかは、Userオブジェクトが保存されると、メモリ上のオブジェクトに対して上記の変更が加えられ、保存がデータベース内のオブジェクトを上書きするということです。あなたは、オブジェクトの修正されていないバージョンが保存しようとしているものと一致するかどうかを調べるためにデータベースにヒットするだけでなく、データベースヒットを必要とする2つのカテゴリセットをループしているロードする。
ここで効率を改善する最良の方法は、ManyToManyフィールドマネージャ自体をサブクラス化することです。これは、事実後の状態を単純に比較するのではなく、メモリ内で発生する変更に注意を払うためです。しかし、これはもう少し複雑で、組み込みのUserオブジェクトを放棄する必要があります。
データベースの制約によってこれが処理されるべきではありませんか? –
この制約は、ドメインとグループ間の関係を処理します。 しかし、私はUsers_GroupsとUsers_Domainの関係をリンクする制約はありません –
トリガーに反対していないのであれば、DBに保存しておくことができます。 –