Какой лучший способ создать модель типа "история" в Django?
Я хотел бы создать для моего приложения Django функцию, аналогичную "Недавним действиям" администратора Django, чтобы хранить историческую информацию о других моих моделях.
Например, скажем, у меня есть две модели: "Книга" и "Автор". Я хочу иметь третью модель, которая хранит информацию, такую как, какое действие было выполнено с данным объектом в модели (добавление, изменение, удаление и т. Д.) Кем и когда.
Кто, когда и действия просты, я просто не уверен, как хранить информацию о том, над каким объектом было выполнено действие.
Моя первоначальная идея состояла в том, чтобы иметь модель "Транзакции", в которой будет храниться эта информация, и моя модель Book и Author может иметь к ней отношение ForeignKey. Однако, если я удаляю данную книгу или автора, то также удаляется его история транзакций, и у меня нет записи, что этот объект действительно был удален.
Я думал о других возможных решениях, но я подумал, что сначала спрошу более опытные мнения. Как мне подойти к этой проблеме и каковы ее разумные решения?
Спасибо!
3 ответа
Возможно, вы захотите проверить django-реверсию - либо внедрить, либо поучиться на ней для своей собственной реализации. Реверсия Django работает путем сохранения информации об изменениях вместе с сериализованной копией элемента, существовавшей в тот момент. Это означает, что вы можете позже вспомнить этот конкретный элемент и сделать сравнение или восстановление или что-то еще.
Если вы решите реализовать собственное решение, я бы порекомендовал использовать встроенную сигнальную подсистему Django. Django из коробки предоставляет общие сигналы для вещей, которые вы упомянули, таких как создание модели, сохранение и удаление. Вы также можете добавить пользовательские сигналы, если обнаружите необходимость в них.
Использование сигналов позволит вам разработать "исторический" код, отдельный от кода реализации "Книга / Автор", который в конечном итоге станет преимуществом (в отличие от последовательного кода истории во всем коде "Книга / Автор"). Опять же, django-reversion служит здесь хорошим ориентиром, почти полностью выполняя свою работу с сигналами.
ИМХО, лучшее решение - это решение, разработанное Марти Алчином в его книге " Pro Django", которое, к сожалению, стоит денег, но, к счастью, это книга, которую стоит получить в любом случае.
Раннюю версию его контрольного журнала можно найти в вики Django на AuditTrail, но я не уверен, насколько хорошо этот код будет работать в последних версиях Django.
Вы также можете попробовать полную историю, которая управляет изменениями вне интерфейса администратора. У меня были некоторые проблемы при тестировании, но это может сработать для вас.