【问题标题】:How to store parent pointers and data in a django reversion?如何在 django reversion 中存储父指针和数据?
【发布时间】:2015-12-27 09:21:22
【问题描述】:

我在我设置的 django-reversion 系统的一些代码上遇到了一些问题。

我有一个 django 模型 ObjectClass,它继承自非抽象模型 _concept说来话长,现在非常不变。在代码的其余上下文中有意义。

_concept 类上,我强制将ForeignKey 字段workgroup 关闭到另一个模型。

我已经注册了 ObjectClass 与 Django reversion,如下所示:

reversion.unregister(ObjectClass)
reversion.register(ObjectClass,follow=['_concept_ptr'])

所有旧版本都保存并可以使用 'django-reversion-compare' 进行比较。不幸的是,当我点击任何旧版本查看历史版本时,我得到了错误:

RevertError at /module.py
Could not revert revision, due to database integrity errors.

在 django-reversion 代码中进行了一些挖掘之后,我做了一些摆弄,发现错误出现了:

RelatedObjectDoesNotExist at /module.py
_concept has no workgroup.

现在我检查了数据库中存储的版本,发现了一些东西:

  1. _concept 的任何给定历史reversion.models.versionserialized_data 字段中都有一个工作组(这是预期的)。
  2. ObjectClass 的任何给定历史 reversion.models.versionserialized_data 字段中没有任何父信息(这是预期的)。
  3. ObjectClass 的任何给定历史 reversion.models.versionserialized_data 字段中具有任何 _concept_ptr(这是预期的)。

我怀疑django-reversion 可能存在以下划线开头的字段的问题,但是我还有其他以下划线开头的字段。

所以我在这里不知所措。有没有办法让这个模型设置像这样工作?


编辑:

经过更多检查,has no workgroup 异常似乎来自 Haystack 调用,这提醒我reversion 出于某种原因忽略了工作组。

我检查了数据库,这是为一个项目序列化的内容(为便于阅读而添加了换行符):

In [28]: myobj.serialized_data
Out[28]: u'[{"fields": {
               "definition": "<p>A code for sex.</p>\\r\\n",
               "_is_locked": false, 
               "workgroup": 3, 
               "created": "2015-12-27T07:45:10.409Z", 
               "modified": "2015-12-27T08:38:26.989Z", 
               "readyToReview": false, 
               "_is_public": false, 
               "name": "Sex Code"
             }, 
             "model": "aristotle_mdr._concept", "pk": 30}]'

编辑 2:

在禁用 haystack 索引器后一切正常,问题是当 django-reversion 尝试保存项目以检查一致性时调用 Haystack 信号 - 然后 django 调用 haystack post_save 信号尝试更新索引数据不完整。

仍然没有解决方案。我在我的 haystack 处理程序中需要的是一种确定我是否在修订事务中的方法,或者一种防止还原让这些信号触发的方法。后者可能是一个更好的长期目标,因为我怀疑仅通过查看修订版就可以更新 Haystack 索引。

【问题讨论】:

    标签: python django django-haystack django-reversion


    【解决方案1】:

    所以你得出了一个结论prevent reversion from letting those signals fire

    https://docs.djangoproject.com/en/dev/topics/signals/#disconnecting-signals

    django-reversion 本身使用 Signal.connect 并自行断开连接。
    https://github.com/etianen/django-reversion/blob/b2f5f3362054b2b72a95bee1ed0dfe2dd2301cda/src/reversion/revisions.py

    我发现你的选择很少。

    1. 找个好地方做disconnect/connect(我猜你需要覆盖reversion,但我不太了解)
    2. (覆盖恢复)排除注册某些信号,例如 haystack。
    3. (override haystack, reversion) 在被保存对象上设置一个标志,并检查 haystack 信号中的标志以立即返回。

    【讨论】:

    • 感谢您的帮助。看起来它是在错误的位置发出信号。最大的问题是 Haystack RealTimeProcessor(每个 save 触发)和还原历史查看器(使用 save 检查每个修订是否有效)之间的冲突。
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2022-11-17
    • 2018-01-30
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2010-09-24
    相关资源
    最近更新 更多