将revision.comment拆分为Django-reversion中的字段和值

时间:2015-03-04 14:50:20

标签: python django django-reversion

我有一个显示版本对象历史列表的功能,如下所示,我在https://github.com/praneethkumarpidugu/django-reversion/blob/master/rev_history/views.py#L1的公共仓库中有这个特殊的.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”。

我的研究推动解决方案我深入研究了reversion / models.py的Revision类,看看是否有任何额外的争论来显示字段和值,但据我了解,我无法找到我可以在哪里找到评论的字段和值。这里引用的是修订版

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

表示字段的解决方案:这可能看起来有点傻但我只是入侵了我自己的评论数据以表示字段为

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

但我仍然需要在更改后获取原始值和新值的字段值。

2 个答案:

答案 0 :(得分:1)

我认为如果你保存了实际和之前的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

答案 1 :(得分:1)

我希望我能正确理解这个问题,这里有半个解决方案:

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))

Haven并未考虑性能开销,但这应该可以解决问题。

希望这有帮助。