2009-03-16 26 views
1

私はデータ管理のためにDjango管理者を使用しています。私は以下の表を持っています:UsersGroups、およびDomainsです。 Usersは、GroupsDomainsの多対多関係を持っています。 Domainsは、Groupsと1対多の関係にあります。 DomainからUserを削除した場合は、その特定のUserおよびGroupsのエントリもDomainに属しています。Django管理者:データベース管理

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

ありがとうございました。

+0

データベースの制約によってこれが処理されるべきではありませんか? –

+0

この制約は、ドメインとグループ間の関係を処理します。 しかし、私はUsers_GroupsとUsers_Domainの関係をリンクする制約はありません –

+0

トリガーに反対していないのであれば、DBに保存しておくことができます。 –

答えて

1

Django book(具体的には、Appendix B)は、Userモデルクラス上のdeleteメソッドをオーバーライドして、余分な削除をトリガー持っ示唆しているようです。

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) 

これは、効率的なソリューションにも、近くではありません。何が起こるかは、Userオブジェクトが保存されると、メモリ上のオブジェクトに対して上記の変更が加えられ、保存がデータベース内のオブジェクトを上書きするということです。あなたは、オブジェクトの修正されていないバージョンが保存しようとしているものと一致するかどうかを調べるためにデータベースにヒットするだけでなく、データベースヒットを必要とする2つのカテゴリセットをループしているロードする。

ここで効率を改善する最良の方法は、ManyToManyフィールドマネージャ自体をサブクラス化することです。これは、事実後の状態を単純に比較するのではなく、メモリ内で発生する変更に注意を払うためです。しかし、これはもう少し複雑で、組み込みのUserオブジェクトを放棄する必要があります。

関連する問題