2016-11-04 2 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) 

を保存()メソッドに渡されたの「自己」のオブジェクトのNEWバージョンですフォームによって生成されました。このコードが実行しようとしているのは

(1)データベースに現在表示されているオブジェクトのコピーを作成します(つまり、フォームが変更される前にデータをコピーしてから)データが新しい行としてコピーされるようにします。

(2)フォームを使用して送信されたオブジェクトの新しいバージョンで既存の行を更新します。

問題は2行のコードの最初の行にあります - DoesNotExist例外を生成します。オブジェクトが存在するので、現在読んでいるデータベース行が現在ロックされているという問題があると考えています。

私の質問は次のとおりです。最初の行を修正/置き換えて、の最初のデータのコピーをフォームに変更する方法がありますか?

ありがとうございました。

答えて

0

同じ属性を持つ新しいオブジェクトを挿入する場合は、オブジェクトの主キーを変更して保存するだけで済みます。

new_ver = self.__class__.objects.get(pk=self.pk) 
new_ver.pk = None 
new_ver.save() 

自動それを生成するプライマリキーとしてなしを使用していません。 django documentationを見ると、より多くの情報を得ることができます。

あなたはまた、あなたのオブジェクトのコピーを作ることができる必要がある場合は、コストが高価になることができますように注意してください:あなたはdjango-reversionを見てみる必要があります

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のWebフレームワークの拡張機能です。

ドキュメントlink

  • ロールバックモデルインスタンスの歴史の中で任意の時点にいます。
  • 削除されたモデルインスタンスを復元します。
  • 管理者との簡単な統合。
関連する問題