У меня возникли проблемы с некоторым кодом для системы реверсии 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.
Теперь я проверил сохраненные версии в базе данных и нашел несколько вещей:
- Любая заданная историческая
reversion.models.version
_концепции имеет рабочую группу в полеserialized_data
(что ожидается). - Любой данный исторический
reversion.models.version
дляObjectClass
не имеет какой-либо родительской информации в полеserialized_data
(что ожидается). - Любое заданное историческое
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.