【问题标题】:Django Admin: Managing databaseDjango Admin:管理数据库
【发布时间】:2010-10-13 16:37:59
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 数据库约束不应该为你处理这个吗?
  • 约束处理域和组之间的关系。但是我没有任何约束链接 Users_Groups 和 Users_Domain 关系
  • 如果您不反对触发器,我认为您仍然可以将其保留在数据库中。

标签: django django-models django-admin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我建议覆盖保存,但我猜你正在使用 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对象被保存时,会对该对象在内存中进行上述更改,然后保存将覆盖数据库中的对象。您不仅遇到了麻烦,不仅要访问数据库来确定对象的未修改版本是否与您要保存的内容一致,而且还要遍历两个类别集,这两个类别都需要访问数据库加载。

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

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2021-10-11
      • 2020-07-22
      • 2011-06-23
      • 1970-01-01
      • 2021-01-01
      相关资源
      最近更新 更多