django-reversion
をご覧ください。 Djangoのバージョン管理機能を提供します。既存のプロジェクトに簡単に追加できます。
"現在の"ポインタアプローチを採用していません。代わりに、保存されるたびにオブジェクトをシリアル化し、別のVersion
モデルに格納します。このモデルには、このオブジェクトを指す汎用外部キーがあります。 (リレーションシップフィールドはデフォルトでプライマリキーとしてシリアル化されています)また、Version
をRevision
に柔軟にグループ化することができます。
だからあなたはそのような何かを行うことができます。ユーザーは、CSVをアップロードすると
は
- は、ちょうどいつものように、変更を保存しますが、ない関数に
@revision.create_on_success
デコレータを追加輸入ので、それによって作られたレコードへの変更関数は1つのリビジョンの下に格納されます。
- ユーザーが「元に戻す」を押すと、最新のリビジョンに戻すだけです。ここで
は、それはそれはあなたが唯一のユーザーのインポートCSVをリビジョンを作成するという事実に依存::
@revision.create_on_success
def import_csv(request, csv):
# Old versions of all objects save()d here will
# belong to single revision.
def undo_last_csv_import(request):
# First, get latest revision saved by this user.
# (Assuming you create revisions only when user imports a CSV
# and do not version control other data.)
revision = Revision.objects.filter(user=request.user)\
.order_by('-date_created')[0]
# And revert it, delete=True means we want to delete
# any newly added records as well
revision.revert(delete=True)
を行うことができる方法です。つまり、他のデータをバージョン管理する予定がある場合は、最新のインポートの影響を受けるレコードを取得するためのフラグを実装する必要があります。次に、このフラグでレコードを取得し、最新の保存済みバージョンを取得し、そのバージョンが属するリビジョン全体を元に戻すことができます。この::
def undo_last_csv_import(request):
some_record = Record.objects.by_user(request.user).from_the_last_import()[0]
latest_saved_version_of_some_record = Version.objects.get_for_date(
some_record,
datetime.now(), # The latest saved Version at the moment.
)
# Revert all versions that belong to the same revision
# as the version we got above.
latest_saved_version_of_some_record.revision.revert()
のようにそれは美しい解決策ではないですが、最も確かにこのアプリで、より良いそれを行うための方法があります。 django-reversion
がどのように機能しているかをよく理解するためのコードを見てみることをお勧めします。文書化されていない関数を見つけることができませんでした。^_^D
(ドキュメントでも良いですが、彼らはVersion.objects.get_for_date(your_model, date)
を書くすなわち、私のために誤解を招くビットであることが判明し、your_modelが実際にモデルインスタンスです。)
更新:ジャンゴ-復帰上記のコードにはあまり依存せず、wikiのバージョンを管理してください。&リビジョンはdjangoの管理者の外にあります。たとえば、リビジョンコメントは既にサポートされているため、少し単純化される可能性があります。