繁体   English   中英

如何在django reversion中存储父指针和数据?

[英]How to store parent pointers and data in a django reversion?

对于我设置的django-reversion系统的代码,我遇到了一些问题。

我有一个django模型ObjectClass ,它继承自非抽象模型_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.

现在我已经检查了数据库中存储的版本,发现了一些东西:

  1. _concept的任何给定的历史reversion.models.versionserialized_data字段中都有一个工作组(这是预期的)。
  2. ObjectClass任何给定历史reversion.models.version 都没有 serialized_data字段中的任何父信息(这是预期的)。
  3. ObjectClass任何给定的历史reversion.models.versionserialized_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:

禁用干草堆索引器之后一切正常,问题是当django-reversion尝试保存项目以检查一致性时调用post_save信号 - 然后django调用干草堆post_save信号,试图用不完整的数据更新索引。

还没有解决方案。 我在干草堆处理程序中需要的是确定我是否在修订事务中的方法,或者是一种防止返回让这些信号触发的方法。 后者可能是一个更好的长期目标,因为我怀疑只是通过查看修订版它正在更新干草堆指数。

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

我看你几乎没有选择。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM