Введение в Django Simple History
Разве не было бы полезно, если бы мы могли документировать изменения в нашей жизни и пересматривать их позже по своему желанию? Это позволило бы нам лучше анализировать ситуации, вспомнить, о чем мы думали, или вспомнить, как мы пришли к текущему состоянию. Хотя в настоящее время не существует такого инструмента для изменений в жизни, один такой инструмент существует в Django. Он называется django-simple-history.
Django-simple-history хранит состояние модели Django при каждой операции создания, обновления или удаления базы данных; он может даже возвращаться к старым версиям модели, записывать, какой пользователь изменил модель, взаимодействовать с несколькими базами данных и многое другое. Вместо того, чтобы вносить изменения в код, django-simple-history дает нам возможность просматривать и выполнять многие изменения через интерфейс администратора.
Представим, что мы создаем простое приложение Polling, и наш файл models.py выглядит следующим образом:
from django.db import models class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') published = models.BooleanField(default="False") def __str__(self): return self.question
Как заставить django-simple-history работать в нашем приложении?
- Установите django-simple-history:
pip install django-simple-history
- В файле settings.py добавьте simple_history в INSTALLED_APPS:
INSTALLED_APPS = [ # ... 'simple_history', ]
Исторические модели могут отслеживать, кто из пользователей внес каждое изменение. Для автоматического заполнения истории пользователей добавьте HistoryRequestMiddleware в настройки проекта.
MIDDLEWARE = [ # ... 'simple_history.middleware.HistoryRequestMiddleware', ]
Чтобы отслеживать изменения пользователей без использования промежуточного ПО, смотрите альтернативу django-simple-history user tracking.
Это все, что требуется в настройках. Теперь давайте вернемся к файлу models.py. Чтобы отслеживать историю модели, нам нужно импортировать HistoricalRecords и создать экземпляр HistoricalRecords в этой модели. Каждой модели нужен собственный экземпляр исторических записей, что дает нам возможность отслеживать или не отслеживать конкретные модели.
- Импортируйте HistoricalRecords и создайте экземпляр в качестве поля модели
from django.db import models from simple_history.models import HistoricalRecords # new line class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') published = models.BooleanField(default="False") history = HistoricalRecords() # new line def __str__(self): return self.question
- Делать и запускать миграции
python manage.py makemigrations python manage.py migrate
Теперь все изменения экземпляра модели Poll будут отслеживаться в базе данных. Выберите вопрос опроса и внесите в него изменения. В данном случае воспользуемся Знаете ли вы django-simple-history?
Затем нажмите История в правом верхнем углу, чтобы увидеть django-simple-history в действии.
Как мы видим, django-simple-history ведет журнал изменений, произошедших с этим вопросом. Мы видим, что оба пользователя Ronard и Luilly внесли изменения, дату и время изменений, а также что пользователь Luilly изменил вопрос для опроса. - все это без ручного запроса к базе данных. Хотя django-simple-history может показаться простым, его полезность возрастает по мере усложнения модели и/или приложения. Представьте себе всю историческую информацию, которую он может предоставить вам для модели клиента, заявки или профиля в большом приложении.
Очень многое django-simple-history позволяет нам сделать: отслеживать историю для модели, которую вы не создавали (сторонняя модель), генерировать начальные изменения для ранее существовавших экземпляров модели и многое другое. Подробнее см. в официальной документации.
Вернуться на верх