【问题标题】:Django reversion does not save revisions made in shellDjango reversion 不保存在 shell 中所做的修订
【发布时间】:2012-08-27 21:42:44
【问题描述】:

我执行了initial installation 步骤并创建了初始修订,但是当我在 django shell 中保存模型时,没有创建新修订:

In [1]: s = Shop.objects.all()[0]
In [2]: import reversion
In [3]: s.name = 'a'
In [4]: s.save()
In [5]: s.name = 'b'
In [6]: s.save()

In [7]: reversion.get_for_object(s)
Out[7]: [<Version: <1> "X">]

这是最初的修订版。

当我从视图更新模型时,会成功创建修订版。

我错过了什么?

models.py 文件是:

 ...
 class Shop(Model):
     ...


 import reversion
 reversion.register(Shop)
 <EOF>

我在post_save 接收器中看到了一个反转方法,虽然我调试它时没有调用它。

我有 Django v1.4.1,reversion v1.6.2。

【问题讨论】:

  • This thread 阐明了这个问题。您在哪里注册带有修订的模型?
  • 您能否尝试将import reversion; reversion.register(Shop) 行放在您定义models.py 文件的底部Shop,看看是否能解决问题?
  • @DavidRobinson:它已经在那里了,就在底部。并且修订仅保存在视图中。

标签: django django-models django-reversion


【解决方案1】:

我写了 django-reversion,所以我想我可以对这个问题有所了解。

保存模型时会自动保存模型的版本,前提是满足以下条件:

  1. 模型已使用 django-reversion 注册。
  2. 代码块被标记为处于修订版中。

第 1 点可以通过使用 VersionAdmin 注册模型或在您的 models.py 文件中显式调用 reversion.register() 来实现。

第 2 点可以通过使用 RevisionMiddlewarereversion.create_revision() 装饰器或上下文管理器来实现。 VersionAdmin 中的任何管理员视图也会保存修订。

因此,如果您的 shell 没有创建版本,那么第 1 点或第 2 点都没有得到满足。以下是解决方法:

  1. 如果您使用的是 VersionAdmin,请在您的 shell 代码中导入相关的管理模块以启动自动注册。或者,在您的 models.py 文件中调用 reversion.register()
  2. 在您的 shell 代码中,使用您调用周围的 reversion.create_revision() 上下文管理器来保存。
with reversion.create_revision():
    s.save()

在 Low Level API wiki 页面上有关此类事情的更多信息:

http://django-reversion.readthedocs.org/en/latest/api.html

【讨论】:

  • 这是有道理的,我冒昧地访问了github.com/etianen/django-reversion/wiki/Low-level-API wiki 页面 .... 说什么是确保模型 save() 始终创建版本的最佳方法?信号?保存()覆盖?
  • 很棒的提示 (#2)。我建议将此添加到 django-reversion 的安装说明中,因为我已将其禁用并且直到我发现这篇文章才注意到这一点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多