Django Admin:管理数据库

时间:2009-03-16 18:44:44

标签: django django-models django-admin

我正在使用Django管理员来管理我的数据。我有以下表格:UsersGroupsDomainsUsersGroupsDomains具有多对多关系。 DomainsGroups有一对多的关系。当我从User中删除Domain时,我还想删除Users_Groups中属于{{1}的特定UserGroups的所有条目}}

我该怎么做?我在哪里放代码?

感谢。

2 个答案:

答案 0 :(得分:1)

Django book(具体来说,Appendix B)似乎建议您覆盖delete模型类上的User方法,并让它触发额外的删除。

答案 1 :(得分:1)

我建议覆盖保存,但我猜你正在使用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)

这甚至不是一个有效的解决方案。将会发生的事情是,当保存用户对象时,将对内存中的对象进行上述更改,然后保存将覆盖数据库中的对象。您不仅要遇到数据库,而且还要查看对象的未修改版本是否与您要保存的内容一致,但是您还要循环使用两个类别集,这两个类都需要数据库命中加载。

在这里提高效率的最佳方法是将ManyToMany字段管理器本身子类化,因为这是在内存中发生变化时注意的变化,而不仅仅是事后比较状态。但这将涉及更多,并且还需要您放弃内置的User对象。