Регистрация изменений значений элементов в объектах Django - PullRequest
5 голосов
/ 09 декабря 2010

В данный момент я думаю о том, как лучше всего реализовать регистрацию изменений в модели, чтобы обеспечить некоторую форму контрольного журнала для объекта.

Я изучал реверсию джанго и в некоторой степени он делает то, что мне нужно, но мои потребности проще. Я просто хочу что-то, что может записать, какой пользователь когда и какое поле изменил в объекте, а также предыдущее значение поля до того, как изменение было зафиксировано.

Простой класс для хранения это будет что-то вроде:

class AuditLogEntry(models.Model):
    user = ForeignKey(User, verbose_name=_(u"user"), related_name="actions")
    obj = ForeignKey(ModelToLog, verbose_name=_(u"Model"), related_name="history")
    timestamp = DateTimeField(default=datetime.now)
    field = models.CharField(max_length=64)
    value = models.CharField(max_length=256)

В настоящий момент я думаю просто добавить блок кода в обработчик представления, который обновляет модель примерно так:

form = ModelToLogForm(request.POST, instance=obj)
prev_data = dict()
for changed_field in form.changed_data:
    prev_data[changed_field] = form.instance.get_attribute(changed_field)
if form.is_valid():
    form.save()
    for changed_field in keys(prev_data):
        obj.history.create(user=request.user, obj=obj, field=changed_field, value=prev_data[changed_field]

Теоретически, это должно сработать, однако я продолжаю испытывать ощущение, что это не лучший способ сделать это. Есть ли лучший способ сделать что-то подобное?

Ответы [ 2 ]

3 голосов
/ 09 декабря 2010

То, что вы хотите сделать, это то, что делает собственная история администратора Django. Прочитайте Привязка к истории моделей администратора Django (возможно, вы можете просто использовать ее напрямую) и посмотрите на исходный код (если вы хотите позаимствовать его подход).

2 голосов
/ 09 декабря 2010

Есть небольшая проблема с вашим подходом. Что произойдет, если модель будет изменена из другого места в коде? Вы не хотите разбрызгивать этот код отслеживания истории везде. Исследуйте сигналы, которые использует решение для истории администрирования django, как упомянуто zobbo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...