【问题标题】:Django Admin relations between tables: save database updates in several tablesDjango 管理员
【发布时间】:2010-10-12 17:05:53
【问题描述】:

我正在使用 Django admin 来管理我的数据。 我有一个用户、组和域表 用户表与组和域表具有多对多关系。 Domains 表与 Groups 表具有一对多的关系。 当我通过管理员保存用户数据时,我还需要在 users_group 和 users_domains 表中进行一些额外的数据库更新。 我该怎么做呢?我把代码放在哪里。 谢谢。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    我想你正在寻找InlineModels。它们允许您在与父模型相同的页面中编辑相关模型。如果您正在寻找比这更好的控制,您可以覆盖 ModelAdmin save methods。

    另外,当您需要某些东西时,请务必查看Manual。真的很不错。

    【讨论】:

    • Paolo:看来我需要重写保存方法。正如我之前提到的,我需要更新几个数据库表......并让其余操作照常执行。我怎么做。谢谢
    • 查看文档中的示例。只需在 AdminModel 类中定义一个名为 save_model 的函数,然后在其中执行您需要的操作。
    • 我只是在玩 save_model。看起来这里放的任何语句都被执行了,即使我没有显式调用 save(),也会执行保存操作。这是正确的行为吗。我无法在 django 网站上找到任何进一步的文档。谢谢。
    • 这是正确的行为。你是想中止保存还是什么?如果没有一些黑客攻击,我认为这是不可能的。
    • 当我保存 save_model 在 POST 和 GET 之前执行。有没有办法在 POST 之后和 GET 之前执行 save_model。
    【解决方案2】:

    更新其他数据库表的最佳方法是执行必要的获取和保存操作。但是,如果您有一个多对多关系,默认情况下,关系的双方都可以从 _set 参数访问。也就是说, user.group_set.all() 将为您提供与用户关联的所有 Group 对象,而 group.user_set.all() 将为您提供与组关联的所有 User 对象。因此,如果您覆盖 save 方法(或注册一个信号侦听器——无论哪个选项听起来风格上更令人愉悦),请尝试:

    for group in user.group_set.all():
        #play with group object
        ....
        group.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2011-08-13
      • 2012-03-13
      • 2012-06-10
      相关资源
      最近更新 更多