В качестве дальнейшего ответа на то, что Натан Воксланд сказал о LiquiBase , приведу пример выполнения миграции под Windows для базы данных mySql:
Поместите соединитель mysql в папке lib в дистрибутиве liquibase, например.
Создайте файл свойств liquibase.properties в корне дистрибутива liquibase и вставьте эти повторяющиеся строки:
driver: com.mysql.jdbc.Driver
classpath: lib\\mysql-connector-java-5.1.30.jar
url: jdbc:mysql://localhost:3306/OLDdatabase
username: root
password: pwd
Создайте или извлеките обновленную базу данных под другим именем, например NEWdatabase .
Теперь вы извлечете различия в файле Migration.xml со следующей командной строкой:
liquibase diffChangeLog --referenceUrl="jdbc:mysql://localhost:3306/NEWdatabase"
--referenceUsername=root --referencePassword=pwd > C:\Users\ME\Desktop\Migration.xml
Наконец, выполните обновление, используя только что созданный Migration.xml. файл:
java -jar liquibase.jar --changeLogFile="C:\Users\ME\Desktop\Migration.xml" update
Примечание: все эти командные строки должны выполняться из домашнего каталога liquibase, в котором находятся liquibase.bat / .sh и liquibase.jar.
История администратора - это просто приложение, как и любое другое приложение Django, за исключением специального размещения на сайте администратора.
Модель находится в django.contrib.admin.models.LogEntry .
Когда пользователь вносит изменение, добавьте его в журнал, как это (бесстыдно украдено из contrib / admin / options.py:
from django.contrib.admin.models import LogEntry, ADDITION
LogEntry.objects.log_action(
user_id = request.user.pk,
content_type_id = ContentType.objects.get_for_model(object).pk,
object_id = object.pk,
object_repr = force_unicode(object),
action_flag = ADDITION
)
где объект
- это объект, который, конечно же, был изменен.
Теперь я вижу ответ Дэниела и согласен с ним, он довольно ограничен.
На мой взгляд, более сильный подход - использовать код Марти Алчина из его книги Pro Django (см. Ведение исторических записей , начиная со страницы 263. Существует приложение django-simple-history , которое реализует и расширяет этот подход ( документы здесь ).
Журнал истории изменений администратора определен в django.contrib.admin.models
, и есть метод history_view
в стандартном ModelAdmin
class.
Они не особенно умны и довольно тесно связаны с администратором, поэтому вам может быть лучше просто использовать их для идей и создать свою собственную версию для своего приложения.
Чтобы добавить к тому, что уже было сказано, вот еще несколько ресурсов для вас:
(1) Я работал с приложением под названием django-reversion который «подключается» к истории администратора и фактически добавляет к ней. Если вам нужен образец кода, то это хорошее место для поиска.
(2) Если вы решили развернуть свою собственную функцию истории, django предоставляет сигналы, на которые вы можете подписаться, чтобы обрабатывать ваше приложение, например post_save для каждого объект истории. Ваш код будет запускаться каждый раз при сохранении записи журнала истории. Документ: Сигналы Django
Здравствуйте,
Я недавно взломал запись некоторых журналов в представление «обновления» для нашей базы данных инвентаризации серверов. Я решил, что поделюсь своим «примером» кода. Следующая функция принимает один из наших объектов «Сервер», список вещей, которые были изменены, и action_flag либо ADDITION, либо CHANGE. Это немного упрощает ситуацию, когда ДОБАВЛЕНИЕ означает «добавлен новый сервер». Более гибкий подход позволит добавить атрибут на сервер. Конечно, было достаточно сложно провести аудит наших существующих функций, чтобы определить, действительно ли произошли изменения, поэтому я достаточно счастлив зарегистрировать новые атрибуты как «изменение».
from django.contrib.admin.models import LogEntry, User, ADDITION, CHANGE
from django.contrib.contenttypes.models import ContentType
def update_server_admin_log(server, updated_list, action_flag):
"""Log changes to Admin log."""
if updated_list or action_flag == ADDITION:
if action_flag == ADDITION:
change_message = "Added server %s with hostname %s." % (server.serial, server.name)
# http://dannyman.toldme.com/2010/06/30/python-list-comma-comma-and/
elif len(updated_list) > 1:
change_message = "Changed " + ", ".join(map(str, updated_list[:-1])) + " and " + updated_list[-1] + "."
else:
change_message = "Changed " + updated_list[0] + "."
# http://stackoverflow.com/questions/987669/tying-in-to-django-admins-model-history
try:
LogEntry.objects.log_action(
# The "update" user added just for this purpose -- you probably want request.user.id
user_id = User.objects.get(username='update').id,
content_type_id = ContentType.objects.get_for_model(server).id,
object_id = server.id,
# HW serial number of our local "Server" object -- definitely change when adapting ;)
object_repr = server.serial,
change_message = change_message,
action_flag = action_flag,
)
except:
print "Failed to log action."