Связывание к образцовой истории администратора Django

В качестве дальнейшего ответа на то, что Натан Воксланд сказал о 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.

85
задан ghickman 6 May 2015 в 11:03
поделиться

4 ответа

История администратора - это просто приложение, как и любое другое приложение 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 , которое реализует и расширяет этот подход ( документы здесь ).

127
ответ дан 24 November 2019 в 08:17
поделиться

Журнал истории изменений администратора определен в django.contrib.admin.models , и есть метод history_view в стандартном ModelAdmin class.

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

21
ответ дан 24 November 2019 в 08:17
поделиться

Чтобы добавить к тому, что уже было сказано, вот еще несколько ресурсов для вас:

(1) Я работал с приложением под названием django-reversion который «подключается» к истории администратора и фактически добавляет к ней. Если вам нужен образец кода, то это хорошее место для поиска.

(2) Если вы решили развернуть свою собственную функцию истории, django предоставляет сигналы, на которые вы можете подписаться, чтобы обрабатывать ваше приложение, например post_save для каждого объект истории. Ваш код будет запускаться каждый раз при сохранении записи журнала истории. Документ: Сигналы Django

7
ответ дан 24 November 2019 в 08:17
поделиться

Пример кода

Здравствуйте,

Я недавно взломал запись некоторых журналов в представление «обновления» для нашей базы данных инвентаризации серверов. Я решил, что поделюсь своим «примером» кода. Следующая функция принимает один из наших объектов «Сервер», список вещей, которые были изменены, и 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."
2
ответ дан 24 November 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: