如何在 Django 还原中存储父指针和数据?
How to store parent pointers and data in a django reversion?
我在使用我设置的 django 还原系统的一些代码时遇到了一些问题。
我有一个继承自非抽象模型 _concept
的 Django 模型 ObjectClass
。 说来话长,现在很不变。在代码的其余上下文中有意义。
在 class _concept
我有强制 ForeignKey
字段 workgroup
关闭到另一个模型。
我已经像这样注册 ObjectClass
到 Django 还原:
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.version
在 serialized_data
字段中都有一个工作组(这是预期的)。
ObjectClass
的任何给定历史 reversion.models.version
在 serialized_data
字段中没有任何父信息(这是预期的).
ObjectClass
的任何给定历史 reversion.models.version
在 serialized_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 索引。
所以你得出结论了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
(我猜你需要重写还原,但我不太了解它)
- (override reversion) 从注册某些信号(如 haystack)中排除。
- (override haystack, reversion) 在being-saved 对象上设置一个标志,并立即检查haystack 信号中的标志到return。
我在使用我设置的 django 还原系统的一些代码时遇到了一些问题。
我有一个继承自非抽象模型 _concept
的 Django 模型 ObjectClass
。 说来话长,现在很不变。在代码的其余上下文中有意义。
在 class _concept
我有强制 ForeignKey
字段 workgroup
关闭到另一个模型。
我已经像这样注册 ObjectClass
到 Django 还原:
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.version
在serialized_data
字段中都有一个工作组(这是预期的)。 ObjectClass
的任何给定历史reversion.models.version
在serialized_data
字段中没有任何父信息(这是预期的).ObjectClass
的任何给定历史reversion.models.version
在serialized_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 索引。
所以你得出结论了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
(我猜你需要重写还原,但我不太了解它) - (override reversion) 从注册某些信号(如 haystack)中排除。
- (override haystack, reversion) 在being-saved 对象上设置一个标志,并立即检查haystack 信号中的标志到return。