1

データの管理に Django admin を使用しています。次のテーブルがあります: UsersGroups、およびDomains。と の両方とUsers多対多の関係があります。と 1 対多の関係があります。からを削除すると、その特定の に属するエントリも削除したいと思います。GroupsDomainsDomainsGroupsUserDomainUsers_GroupsUserGroupsDomain

どうすればいいですか?コードはどこに置くのですか?

ありがとう。

4

2 に答える 2

1

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 オブジェクトを破棄する必要があります。

于 2009-03-17T14:07:51.010 に答える
1

Djangoの本(具体的には、付録 Bdelete )では、モデル クラスのメソッドをオーバーライドしUser、余分な削除をトリガーすることを提案しているようです。

于 2009-03-16T20:24:29.083 に答える