Как хранить родительские указатели и данные в реверсии django?

У меня возникли проблемы с некоторым кодом для системы реверсии django, которую я настроил.

У меня есть модель django ObjectClass, которая наследуется от неабстрактной модели _concept. Долгая история, которую сейчас уже не изменить. Имеет смысл в остальном контексте кода.

На классе _concept у меня есть обязательное ForeignKey поле workgroup для другой модели.

Я зарегистрировал ObjectClass с реверсией Django следующим образом:

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 я немного повозился и обнаружил, что ошибка возникает следующим образом:

RelatedObjectDoesNotExist at /module.py
_concept has no workgroup.

Теперь я проверил сохраненные версии в базе данных и нашел несколько вещей:

  1. Любая заданная историческая reversion.models.version _концепции имеет рабочую группу в поле serialized_data (что ожидается).
  2. Любой данный исторический reversion.models.version для ObjectClass не имеет какой-либо родительской информации в поле serialized_data (что ожидается).
  3. Любое заданное историческое reversion.models.version из ObjectClass не содержит _concept_ptr в поле serialized_data (что не ожидается).

Я подозреваю, что у 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 пытается сохранить элементы для проверки согласованности, а затем django вызывает сигналы стога сена post_save, которые пытаются обновить индекс с неполными данными.

До сих пор нет решения. Что мне нужно в моем обработчике стога сена, так это либо способ определить, нахожусь ли я внутри транзакции ревизий, либо способ предотвратить срабатывание этих сигналов при возврате. Последнее, вероятно, является лучшей долгосрочной целью, поскольку я подозреваю, что просто просматривая ревизии, он обновляет индекс Haystack.


person Community    schedule 27.12.2015    source источник


Ответы (1)


Итак, вы пришли к выводу 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 (я думаю, вам нужно будет переопределить реверсию, но я мало что знаю об этом)
  2. (переопределить реверсию) исключить из регистрации определенные сигналы, такие как стог сена.
  3. (переопределить стог сена, реверсия) установить флаг на сохраняемом объекте и проверить флаг в сигнале стога сена для немедленного возврата.
person eugene    schedule 04.01.2016
comment
Спасибо за помощь здесь. Похоже, это было вокруг сигналов, запускаемых не в тех местах. Самой большой проблемой был конфликт между процессором Haystack RealTimeProcessor (запускаемым каждые save) и средством просмотра истории реверсий (использовавшим save для проверки правильности каждой ревизии). - person ; 06.01.2016