Быстрый старт¶
Установите¶
Установите из PyPI с pip
:
$ pip install django-simple-history
Настроить¶
Настройки¶
Добавьте simple_history
к вашему INSTALLED_APPS
.
INSTALLED_APPS = [
# ...
'simple_history',
]
Исторические модели могут отслеживать, кто внес каждое изменение. Чтобы автоматически заполнять историю пользователей, вы можете добавить HistoryRequestMiddleware
в настройки Django:
MIDDLEWARE = [
# ...
'simple_history.middleware.HistoryRequestMiddleware',
]
Если вы не хотите использовать промежуточное ПО, вы можете явно указать пользователя, вносящего изменения, как это описано в Отслеживание пользователей.
История пути¶
Чтобы отследить историю для модели, создайте экземпляр simple_history.models.HistoricalRecords
на модели.
Пример для отслеживания изменений в моделях Poll
и << 1 >>> в учебнике Django:
from django.db import models
from simple_history.models import HistoricalRecords
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
history = HistoricalRecords()
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
history = HistoricalRecords()
Теперь все изменения в экземплярах моделей Poll
и << 1 >>> будут отслеживаться в базе данных.
История пути для модели третьей стороны¶
Чтобы отследить историю для модели, которую вы не создавали, используйте функцию simple_history.register
. Вы можете использовать ее для отслеживания моделей из сторонних приложений, над которыми у вас нет контроля. Вот пример использования функции simple_history.register
для отслеживания истории модели User
из приложения django.contrib.auth
:
from simple_history import register
from django.contrib.auth.models import User
register(User)
Если вы хотите отделить миграции исторической модели в приложение, отличное от приложения сторонней модели, вы можете установить параметр app
в register
. Например, если вы хотите, чтобы миграции жили в папке migrations пакета, в котором вы зарегистрировали модель, вы можете сделать следующее:
register(User, app=__package__)
Запуск миграций¶
После внесения изменений в модель создайте и примените миграции базы данных:
$ python manage.py makemigrations
$ python manage.py migrate
Существующие проекты¶
Для существующих проектов можно вызвать команду populate, чтобы сгенерировать начальные изменения для ранее существовавших экземпляров модели:
$ python manage.py populate_history --auto
По умолчанию строки истории вставляются партиями по 200 штук. При необходимости это можно изменить для больших таблиц, используя опцию --batchsize
, например --batchsize 500
.
Что теперь?¶
Добавляя HistoricalRecords
к модели или регистрируя модель с помощью register
, вы автоматически начинаете отслеживать любое создание, обновление или удаление, которое происходит в этой модели. Теперь вы можете query the history programmatically и << 3 >>>.
Что django-simple-history
делает за кулисами?¶
Если вы попробовали код above и запустили на нем миграции, то в вашей базе данных появятся следующие таблицы:
app_choice
app_historicalchoice
app_historicalpoll
app_poll
Две дополнительные таблицы с приставкой historical
к их именам - это таблицы, созданные с помощью django-simple-history
. Эти таблицы хранят все изменения, которые вы вносите в соответствующие базовые таблицы. Каждый раз, когда происходит создание, обновление или удаление в Choice
или << 3 >>>, создается новая строка в исторической таблице для этой модели, включающая все поля экземпляра базовой модели, а также другие метаданные:
history_user
: пользователь, который выполнил создание/обновление/удалениеhistory_date
: время, в которое произошло создание/обновление/удалениеhistory_change_reason
: причина, по которой произошло создание/обновление/удаление (по умолчанию null)history_id
: первичный ключ для исторической таблицы (обратите внимание, что первичный ключ базовой таблицы не является уникальным для исторической таблицы, поскольку существует несколько его версий в исторической таблице)history_type
:+
для создания,~
для обновления и-
для удаления
Теперь попробуйте сохранить экземпляр Choice
или Poll
. Проверьте таблицу истории, чтобы убедиться, что история отслеживается.