簡體   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