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

我有一个从非抽象模型 ObjectClass 继承的 django 模型 _concept 。很长的故事,现在非常不可改变。在代码的其余上下文中是有意义的。

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

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

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.

现在我检查了数据库中存储的版本并发现了一些东西:
  • 任何给定的 _concept 历史 reversion.models.versionserialized_data 字段中都有一个工作组(这是预期的)。
  • reversion.models.version 的任何给定历史 ObjectClassserialized_data 字段中都没有任何父信息(这是预期的)。
  • reversion.models.version 的任何给定历史 ObjectClass_concept_ptr 字段中都没有任何 serialized_data(这是 而不是预期的 )。

  • 我怀疑 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 索引。

    最佳答案

    所以你得出了结论 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

    我看你有几个选择。

  • 找到一个执行 disconnect/connect 的好地方(我猜你需要覆盖 reversion,但我对此知之甚少)
  • (override reversion) 排除注册某些信号,例如 haystack。
  • (override haystack, reversion) 在正在保存的对象上设置一个标志,并检查 haystack 信号中的标志立即返回。
  • 关于python - 如何在 Django 还原中存储父指针和数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34479124/

    10-12 17:50