如何在Django Reversion中存储父指针和数据?

3
我在我设置的django-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.

现在我已经检查了数据库中存储的版本,并发现了一些问题:
  1. 任何一个历史版本的_concept在serialized_data字段中都有一个工作组(reversion.models.version),这是预期的。
  2. 任何一个历史版本的ObjectClass都没有父信息在serialized_data字段中(这是预期的)。
  3. 任何一个历史版本的ObjectClass都没有serialized_data字段中的_concept_ptr(这是不预期的)。
我怀疑django-reversion可能存在下划线开头的字段的问题,但我有其他下划线开头的字段。
所以我感到很茫然。有没有办法让这个模型设置像这样工作?
编辑:
进一步检查后,似乎"没有工作组"的异常来自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索引。

1个回答

2

所以你得出了一个结论,那就是“防止回滚让这些信号触发”。

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

django-reversion本身使用Signal.connect和disconnect来连接和断开信号。
https://github.com/etianen/django-reversion/blob/b2f5f3362054b2b72a95bee1ed0dfe2dd2301cda/src/reversion/revisions.py

我看到你有几个选择。

  1. 找到一个好的地方来进行disconnect/connect(我猜你需要重写reversion,但我对它不太了解)
  2. (重写reversion)排除注册某些信号,如haystack。
  3. (重写haystack,reversion)在正在保存的对象上设置一个标志,并在haystack信号中检查该标志以立即返回。

感谢您在这里的帮助。看起来问题出在信号被错误地触发了。最大的问题在于Haystack实时处理器(每次“保存”都会触发),与版本历史记录查看器之间存在冲突(后者使用“保存”来检查每个修订版本是否有效)。 - user764357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接