在保存

时间:2016-11-04 08:57:48

标签: python django django-models

对于我的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异常。该对象确实存在,所以我现在认为问题是它正在尝试读取的数据库行目前已被锁定。

所以我的问题是:有没有办法可以修改/替换第一行,以便我有一个初始数据的副本,就像在表单修改之前一样?

感谢。

2 个答案:

答案 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

功能

  • 回滚到模型实例历史记录中的任意位置。
  • 恢复已删除的模型实例。
  • 简单的管理集成。