Skip to main content
 首页 » 编程设计

python之使用 Django 还原更改名称后如何获取以前的对象值

2025年05月04日34java哥

在How to add django-reversion to an app developed using django and django-rest framework我添加了以下函数来获取对象的历史记录

from django.http import HttpResponse 
from reversion.models import Version 
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") 

在How to add django-reversion to an app developed using django and django-rest framework的urls.py中我添加了一条通往历史的路线。

当我访问 127.0.0.1:8000/history 时,我得到的 json 数据为

[{"object": "someobject", "user": "someuseruser", "type": "sometype", "comment": "Changed name.", "date_time": "2015-03-02 18:04:58.368650+00:00"}] 

执行流程:当我访问 127.0.0.1:8000/admin 并将上述对象的值更改为“otherobject”时。当我刷新 127.0.0.1:8000/history 时。我又得到一个 json 字段

[{"object": "otherobject", "user": "someuseruser", "type": "sometype", "comment": "Changed name.", "date_time": "2015-03-02 18:04:58.368650+00:00"}] 

下面是我在向历史函数中添加一个额外字段时遇到的问题:

我想在历史函数的上述迭代中再包含一个字段。像 previous_object: ""在更改名称之前获取对象名称,即使在更改名称之后也是如此。 例如:- 来自 127.0.0.1:8000/管理员 我将对象名称从“apple”更改为“orange”。

当我访问历史路由127.0.0.1:8000/history时

[{"object": "apple", "object_before_changed": ""null": "someuseruser", "type": "sometype", "comment": "Changed name.", "date_time": "2015-03-02 18:00:58.368650+00:00"}] 

我应该能够看到如下

[{"object": "orange", "object before_changed": ""apple": "someuseruser", "type": "sometype", "comment": "Changed name.", "date_time": "2015-03-02 18:04:58.368650+00:00"}] 

请您参考如下方法:

您只需要设置一个变量来保存上一个项目,并根据需要将其插入到字典中。请注意,这使用了 getattr作为获取 previous_object 的 object_repr 的方法,如果没有则安全地提供默认值(第一次迭代就是这种情况)。

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