我在为我设置的 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.
现在我检查了数据库中存储的版本并发现了一些东西:
reversion.models.version
在 serialized_data
字段中都有一个工作组(这是预期的)。 reversion.models.version
的任何给定历史 ObjectClass
在 serialized_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,但我对此知之甚少) 关于python - 如何在 Django 还原中存储父指针和数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34479124/