【问题标题】:Model does not create a verion after deleting a foreign key model object (django-reversion)删除外键模型对象后模型不创建版本(django-reversion)
【发布时间】:2016-06-11 05:06:15
【问题描述】:

我有 2 节课:

class ContactInternal(models.Model):
    name = models.CharField(max_length=80)
SysAppApp = apps.get_app_config('SysApp')
SysAppModel = SysAppApp.models
reversion.register(ContactInternal, follow=["fk_contactinternal_sysapp"])
reversion.register(SysAppModel)

# SysApp from another app called 'SysApp'
class SysApp(models.Model):
    name = models.CharField(max_length=80)
    internalcontact = models.ForeignKey(ContactInternal, related_name='fk_contactinternal_sysapp', null=True, verbose_name="Internal Contact",blank=True,on_delete=models.SET_NULL)

在大多数情况下都可以正常工作。例如当我对 ContactInternal 进行更改时,会为 SysApp 创建一个新版本。对它的工作方式非常满意。

但是,如果我删除从 SysApp.internalcontact 链接的记录,则不会为 SysApp 创建任何版本。

实际上我想要实现的只是获取 SysApp 的最后修改日期的时间戳以及哪个用户(不需要回滚)。我想知道

'When Peter delete a John from ContactInternal on 26th Feb, it will show Peter updated SysApp on 26th Feb'

我该如何使用django-reversion?或者有其他方法可以实现吗?

  • 注意:SysApp 中还有另一个字段是 M2M,我也想达到相同的结果。

【问题讨论】:

    标签: python django postgresql audit django-reversion


    【解决方案1】:

    找到解决办法:

    需要 3 个步骤: 1) 在 settings.py 中将“reversion.middleware.RevisionMiddleware”添加到 MIDDLEWARE_CLASSES 2)创建一个pre_delete信号函数来查找SysApp对象 3) 为 SysApp obj 显式调用 save()

    一些解释: 1) 通过添加中间件,对模型的任何更改都将添加到修订历史记录中 2) 使用 pre_delete 信号查找 SysApp 对象(父对象) 3) 调用 save() 强制 django-reversion 创建一个修订版

    一些参考资料: django-reversion 文档:http://django-reversion.readthedocs.org/en/latest/api.html 使用信号的快速示例:http://www.koopman.me/2015/01/django-signals-example/

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 2011-05-10
      • 2023-01-02
      • 2017-04-07
      • 2019-05-09
      • 2018-01-30
      • 2015-05-20
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多