我在我设置的django-reversion系统中遇到了一些代码问题。
我有一个django模型ObjectClass,它继承自非抽象模型_concept。在概念代码的其余上下文中,这很有道理。
在类_concept上,我有强制性的ForeignKey字段workgroup指向另一个模型。
我已经像这样使用Django版本控制为ObjectClass注册了版本控制:
所有旧版本都可以使用“django-reversion-compare”保存和比较。不幸的是,当我点击任何旧版本查看历史版本时,会出现错误:
现在我已经检查了数据库中存储的版本,并发现了一些问题:
所以我感到很茫然。有没有办法让这个模型设置像这样工作?
编辑:
进一步检查后,似乎"没有工作组"的异常来自Haystack调用,这提醒我reversion出于某种原因忽略了工作组。
我检查了数据库,这是一个项目被序列化的内容(为了可读性添加了换行符):
我有一个django模型ObjectClass,它继承自非抽象模型_concept。在概念代码的其余上下文中,这很有道理。
在类_concept上,我有强制性的ForeignKey字段workgroup指向另一个模型。
我已经像这样使用Django版本控制为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在serialized_data字段中都有一个工作组(reversion.models.version),这是预期的。
- 任何一个历史版本的ObjectClass都没有父信息在serialized_data字段中(这是预期的)。
- 任何一个历史版本的ObjectClass都没有serialized_data字段中的_concept_ptr(这是不预期的)。
所以我感到很茫然。有没有办法让这个模型设置像这样工作?
编辑:
进一步检查后,似乎"没有工作组"的异常来自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处理程序中需要的是确定是否在修订事务内部的方法,或者防止reversion触发这些信号的方法。后者可能是更好的长期目标,因为我怀疑它只是通过查看修订来更新Haystack索引。