首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django-reversion中将revision.comment拆分为字段和值

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

Stack Overflow用户
提问于 2015-03-04 14:50:19
回答 2查看 755关注 0票数 1

我有一个函数来显示版本对象的历史列表,如下所示,我在history/views.py#L1的公共回购中有这个特定的history/views.py#L1文件

代码语言:javascript
复制
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/历史

我看到json的数据如下:

代码语言:javascript
复制
{"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的修订类,以查看是否有任何额外的论证来显示字段和价值,但据我所知,我无法找到可以在哪里找到字段和值以供评论的线索。这是修订版的评论,供参考。

代码语言:javascript
复制
comment = models.TextField(blank=True,
                               verbose_name=_("comment"),
                               help_text="A text comment on this revision.")

表示字段的解决方案:这看起来可能有点傻,但我只是黑进了上面我自己的评论数据,将字段表示为

代码语言:javascript
复制
  'field': i.revision.comment.split(' ')[-1] 

但是我仍然需要得到字段的值,这些值在变化后是原始的和新的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-05 20:18:32

我希望我能正确地理解这个问题,这是一个半生不熟的解决方案:

代码语言:javascript
复制
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))

对性能开销考虑得不多,但这应该能起作用。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-03-04 18:16:10

我认为,如果您保存了实际的和以前的ver.field_dict (您进行版本提交的相同位置),然后比较并将版本更改保存到另一个模型中,您可以实现您想要的结果。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28857467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档