Как лучше всего создать модель типа «история» в django?

Я хотел бы создать функцию для своего приложения Django, аналогичную «Последним действиям» администратора Django, чтобы хранить информацию об истории в других моих моделях.

Например, у меня есть две модели с именами Book и Author. Я хочу иметь третью модель, которая хранит информацию о том, какое действие было выполнено над данным объектом в модели (добавление, изменение, удаление и т. д.), кем и когда.

Кто, когда и действие легко, я просто не уверен, как хранить информацию о том, над каким объектом было выполнено действие.

Моя первоначальная идея состояла в том, чтобы иметь модель «Транзакции», которая хранила бы эту информацию, и обе мои модели «Книга» и «Автор» могли бы иметь к ней отношение ForeignKey. Однако, если я удаляю данную книгу или автора, то история его транзакций также удаляется, и у меня нет записи о том, что этот объект действительно был удален.

Я думал о других возможных решениях, но я подумал, что сначала попрошу здесь более опытных мнений. Как мне подойти к этой проблеме и какие есть разумные решения?

Спасибо!


person hora    schedule 17.11.2009    source источник


Ответы (3)


Вы можете проверить django-reversion -- Либо реализовать или извлечь из него уроки для собственной реализации. Реверсия Django работает, сохраняя информацию об изменении вместе с сериализованной копией элемента в том виде, в каком он существовал в тот момент. Это означает, что вы можете позже вспомнить этот конкретный элемент и выполнить сравнение, восстановление или что-то еще.

Если вы решите реализовать свое собственное решение, я бы порекомендовал использовать встроенный в Django сигнальная подсистема. Django из коробки предоставляет общие сигналы для упомянутых вами вещей, таких как создание, сохранение и удаление модели. Вы также можете добавить пользовательские сигналы, если они вам нужны.

Использование сигналов позволит вам разработать «исторический» код отдельно от кода реализации Книги/Автора, который в долгосрочной перспективе будет активом (в отличие от последовательного кода истории по всему коду Книги/Автора). Опять же, django-reversion служит здесь хорошим ориентиром, выполняя свою работу почти полностью с сигналами.

person T. Stone    schedule 18.11.2009
comment
Спасибо, это действительно полезно. django-revision, кажется, слишком много для моих нужд, но сигнальная система действительно поможет мне здесь. - person hora; 20.11.2009

ИМХО лучшее решение - это то, что разработал Марти Алчин в его книге Pro Django, которая, к сожалению, стоит денег, но, к счастью, книга, которую стоит получить в любом случае.

Раннюю версию его журнала аудита можно найти на вики Django по адресу AuditTrail, но я не уверен, насколько хорошо этот код будет работать в последних версиях Django.

person Van Gale    schedule 18.11.2009

Вы также можете попробовать fullhistory, которая управляет изменениями вне интерфейса администратора. У меня были некоторые проблемы при тестировании, но это может сработать для вас.

person ArBaDaCarBa    schedule 18.11.2009