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

2024-05-07 17:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我对我建立的django恢复系统的一些代码有一些问题。在

我有一个django模型ObjectClass,它继承了一个非抽象模型_concept。说来话长,现在很难改变。在代码的其他上下文中是有意义的。

在类_concept上,我将强制的ForeignKey字段workgroup关闭到另一个模型。在

我已经用Django reversion注册了ObjectClass,如下所示:

reversion.unregister(ObjectClass)
reversion.register(ObjectClass,follow=['_concept_ptr'])

所有旧版本保存并可以使用“django reversion compare”进行比较。不幸的是,当我点击任何旧版本查看历史版本时,我得到了一个错误:

^{pr2}$

在对django reversion代码进行了一番挖掘之后,我做了一些修改,发现错误就出现了:

RelatedObjectDoesNotExist at /module.py
_concept has no workgroup.

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

  1. 任何给定的历史概念reversion.models.versionserialized_data字段中都有一个工作组(这是预期的)。在
  2. 一个ObjectClass的任何给定历史reversion.models.versionserialized_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:

禁用haystack索引器后一切正常,问题是django reversion试图保存项以检查一致性时调用haystack信号—然后django调用haystack post_save信号,试图用不完整的数据更新索引。在

仍然没有解决办法。在我的haystack处理程序中,我需要的要么是一种确定我是否在修订事务中的方法,要么是一种防止reversion让这些信号触发的方法。后者可能是一个更好的长期目标,因为我怀疑,仅仅通过观察修正,它正在更新干草堆指数。在


Tags: django代码模型falsedata信号versionmodels
1条回答
网友
1楼 · 发布于 2024-05-07 17:28:25

所以你得出了一个结论prevent reversion from letting those signals fire

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

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

我看你别无选择。在

  1. 找一个好地方去做disconnect/connect(我想你可能需要重写反转,但我对此知之甚少)
  2. (覆盖恢复)排除某些信号,如干草堆。在
  3. (override haystack,reversion)在正在保存的对象上设置一个标志,并检查haystack信号中的标志以立即返回。在

相关问题 更多 >