Django reversion不保存shell中的修订版

cul*_*rón 9 django django-models django-reversion

我做了初始安装步骤并创建了初始修订版,但是当我在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">]
Run Code Online (Sandbox Code Playgroud)

这是初始修订版.

从视图更新模型时,会成功创建修订.

我错过了什么?

models.py文件是:

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


 import reversion
 reversion.register(Shop)
 <EOF>
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*ave 25

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

保存模型时会自动保存模型版本,提供以下条件:

  1. 该模型使用django-reversion注册.
  2. 代码块标记为在修订内.

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

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

因此,如果您的shell没有创建版本,则不会满足第1点或第2点.以下是修复方法:

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

有关Low Level API wiki页面上此类内容的更多信息:

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