对于我的Django应用程序,我希望保留所有对象的完整编辑历史记录。作为其中的一部分,我已经覆盖了模型的save()方法,其中一部分如下所示:
# Replicate the current version (from the db) with all attributes unchanged
new_ver = self.__class__.objects.get(pk=self.pk).save(force_insert=True)
# Update the current version in the database with the new attributes
super(CodexBaseClass, self).save(*args, force_update=True, **kwargs)
传递给save()方法的'self'是由表单生成的对象的新版本。这段代码试图做的是
(1)制作当前出现在数据库中的对象的副本(即:复制表单修改之前的数据),然后强制插入此数据,以便将其复制为新行< / p>
(2)使用通过表单提交的新版本对象更新现有行。
问题出在两行代码的第一行 - 它会生成一个DoesNotExist异常。该对象确实存在,所以我现在认为问题是它正在尝试读取的数据库行目前已被锁定。
所以我的问题是:有没有办法可以修改/替换第一行,以便我有一个初始数据的副本,就像在表单修改之前一样?
感谢。
答案 0 :(得分:0)
如果要插入具有相同属性的新对象,则只需更改对象的主键并保存即可。
new_ver = self.__class__.objects.get(pk=self.pk) new_ver.pk = None new_ver.save()
使用无作为主键将自动生成它。如果查看django documentation,可以获得更多信息。
如果您需要,您也可以复制您的物品,小心费用可能很昂贵:
from copy import deepcopy ver = self.__class__.objects.get(pk=self.pk) new_ver = deepcopy(ver) new_ver.pk = None new_ver.save() # Do what you need with ver object
答案 1 :(得分:0)
您应该查看django-reversion。
django-reversion是Django Web框架的扩展 为模型实例提供版本控制。
文档:link
功能强>