2016-11-04 59 views
-1

對於我的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()方法中的「自我」是,是該對象的新版本由表單生成。此代碼試圖執行的操作是:

(1)製作當前出現在數據庫中的對象的副本(即:複製數據,因爲它是在表單修改之前進行的),然後強制插入此對象數據,因此它被複製爲新行

(2)使用通過表單提交的新對象的新版本更新現有行。

問題在於兩行代碼的第一行 - 它生成了DoesNotExist異常。該對象確實存在,所以我現在認爲問題在於它試圖讀取的數據庫行當前被鎖定。

所以我的問題是:有沒有辦法我可以修改/替換第一行,以便我有一個初始數據的副本,因爲它是在表單修改之前?

感謝。

回答

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 
+0

我已經試過了。它給出了相同的例外。 自我。__class __。objects.get(pk = self.pk) 是似乎是問題的部分。 self.pk引用的對象是由UpdateView編輯的對象,所以看起來我無法從數據庫中讀取該特定對象,至少不能使用此方法。 – Ben

+0

你試過我的答案嗎? – e4c5

0

你應該看看django-reversion

django的硫化返原的一個擴展Django的網絡框架, 提供用於模型實例的版本控制。

文檔link

特點

  • 回滾到一個模型實例歷史上的任何一點。
  • 恢復刪除的模型實例。
  • 簡單的管理集成。