Разбить revision.comment на поле и значение в Django-реверсии

У меня есть функция для отображения списка истории объектов версий, как показано ниже, и у меня есть этот конкретный файл.py в публичном репо на https://github.com/praneethkumarpidugu/django-reversion/blob/master/rev_history/views.py:

from django.http import HttpResponse
from reversion.models import Version
#from django.contrib.admin.models import LogEntry
import json

def history_list(request):
    history_list = Version.objects.all().order_by('-revision__date_created')

    data = []

    for i in history_list:
        data.append({
            'date_time': str(i.revision.date_created),
            'user': str(i.revision.user),
            'object': i.object_repr,
            'type': i.content_type.name,
            'comment': i.revision.comment
        })

    data_ser = json.dumps(data)
    return HttpResponse(data_ser, content_type="application/json")

Чтобы изменить объектные сущности, которые я посетил страницу администратора 127.0.0.1:8000/admin, я изменил логическое поле для представления, скажем "is_active", с true на false.

Теперь я перехожу на страницу истории 127.0.0.1:8000/history

Я вижу данные JSON, как показано ниже:

{"type": "model a", "date_time": "2015-03-04 15:58:36.141569+00:00", **"comment": "Changed is_active."**, "object": "ModelA object", "user": "admin1"}

Решение, вероятно, будет иметь: Я хочу, чтобы комментарий был разделен как previous_value: "True", "new_value": "False", "field": "is_active".

мое исследование направлено на решение проблемы. Я покопался в Revision class of reversion / models.py, чтобы посмотреть, есть ли какие-либо дополнительные аргументы для отображения поля и значения, но, насколько я понимаю, я не могу найти подсказку, где можно найти поле и значения для комментария, для справки вот комментарий от ревизии

comment = models.TextField(blank=True,
                               verbose_name=_("comment"),
                               help_text="A text comment on this revision.")

Решение для представления поля: Это может выглядеть немного глупо, но я просто взломал свои собственные данные комментария выше, чтобы представить поле как

  'field': i.revision.comment.split(' ')[-1] 

Но мне все еще нужно получить значения поля, которые являются оригинальными и новыми значениями после изменения.

2 ответа

Решение

Надеюсь, я правильно понял проблему, вот ее недоделанное решение:

from django.db.models.signals import pre_save
from django.dispatch import receiver
import reversion

@receiver(pre_save)
def _pre_save(sender, **kwargs):
    _i = kwargs.get('instance')
    _i_old = sender.objects.get(pk=_i.pk)
    _current, _past = set(_i.__dict__.keys()), set(_i_old.__dict__.keys())
    _intersection = _current.intersection(_past)
    _changed_keys = set(o for o in _intersection if _i.__dict__[o] != _i_old.__dict__[o])
    _comment = ['changed {} from {} to {}'.format(_, _i_old.__dict__[_], _i.__dict__[_]) for _ in _changed_keys]
    reversion.set_comment(', '.join(_comment))

Не особо задумывался о снижении производительности, но это должно сработать.

Надеюсь это поможет.

Я думаю, что если вы сохраните ver.field_dict фактического и предыдущего (в том же месте, где вы делаете фиксацию версии), сравните и сохраните изменения версии в другой модели, и вы сможете достичь того, чего хотите.

history_list = Version.objects.all().order_by('-revision__date_created')
ver = history_list[0]
ver.field_dict

Может быть, это приложение может помочь вам. https://github.com/jedie/django-reversion-compare

Другие вопросы по тегам