Введение в 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 работать в нашем приложении?

  1. Установите django-simple-history:
pip install django-simple-history
  1. В файле 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 в этой модели. Каждой модели нужен собственный экземпляр исторических записей, что дает нам возможность отслеживать или не отслеживать конкретные модели.

  1. Импортируйте 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
  1. Делать и запускать миграции
python manage.py makemigrations
python manage.py migrate

Теперь все изменения экземпляра модели Poll будут отслеживаться в базе данных. Выберите вопрос опроса и внесите в него изменения. В данном случае воспользуемся Знаете ли вы django-simple-history?

Several questions

Затем нажмите История в правом верхнем углу, чтобы увидеть django-simple-history в действии.

Django See History Django Simple History

Как мы видим, django-simple-history ведет журнал изменений, произошедших с этим вопросом. Мы видим, что оба пользователя Ronard и Luilly внесли изменения, дату и время изменений, а также что пользователь Luilly изменил вопрос для опроса. - все это без ручного запроса к базе данных. Хотя django-simple-history может показаться простым, его полезность возрастает по мере усложнения модели и/или приложения. Представьте себе всю историческую информацию, которую он может предоставить вам для модели клиента, заявки или профиля в большом приложении.

Очень многое django-simple-history позволяет нам сделать: отслеживать историю для модели, которую вы не создавали (сторонняя модель), генерировать начальные изменения для ранее существовавших экземпляров модели и многое другое. Подробнее см. в официальной документации.

Вернуться на верх