Django admin: Gerenciamento de banco de dados

votos
1

Eu estou usando Django admin para gerenciar meus dados. Eu tenho as seguintes tabelas: Users, Groups, e Domains. Userstem um relacionamento muitos-para-muitos com ambos Groupse Domains. Domainstem uma relação de um-para-muitos com Groups. Quando eu remover uma Usera partir de um Domain, eu também quero remover todas as entradas no Users_Groupspara esse particular Usere Groupspertencente à Domain.

Como eu faço isso? Onde devo colocar o código?

Obrigado.

Publicado 16/03/2009 em 19:44
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Eu sugeriria substituindo salvar, mas eu estou supondo que você está usando o objeto django.contrib.auth.User. Nesse caso, você pode fazer a mesma coisa com um sinal 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)

Isto não é nem perto de uma solução eficiente. O que vai acontecer é que quando um objeto de usuário é salvo, as alterações acima serão feitos para o objeto na memória, então a salvar irá substituir o objeto no banco de dados. Você foi para a dificuldade não só de bater o banco de dados para descobrir se a versão não modificada do objeto concorda com com o que você está prestes a salvar, mas você também está looping através de dois conjuntos de categorias, tanto a necessidade de um hit de banco de dados para carregar.

A melhor maneira de fazer uma melhoria da eficiência aqui seria a subclasse o próprio gerente de campo ManyToMany, porque é isso que está prestando atenção às mudanças à medida que ocorrem na memória, em vez de simplesmente comparar estado após o fato. Mas isso seria um pouco mais envolvidos e também exigem que você abandonar o objeto Usuário embutido.

Respondeu 17/03/2009 em 15:07
fonte usuário

votos
1

O livro de Django (especificamente, Apêndice B ) parece sugerir você substituir o deletemétodo na Userclasse de modelo e tê-lo acionar as exclusões extras.

Respondeu 16/03/2009 em 21:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more