Какой лучший способ создать модель типа «история» в Django? - PullRequest
2 голосов
/ 18 ноября 2009

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

5 голосов
/ 18 ноября 2009

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

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

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

1 голос
/ 18 ноября 2009

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

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

0 голосов
/ 18 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...