をご覧くださいdjango-reversion。Django モデルのバージョン管理を提供します。既存のプロジェクトに簡単に追加できます。
「現在の」ポインターアプローチは採用していません。代わりに、保存されるたびにオブジェクトをシリアル化し、Versionこのオブジェクトを指す一般的な外部キーを使用して別のモデルに格納します。(リレーションシップ フィールドは、デフォルトで主キーとしてシリアル化されます。) また、柔軟な方法でVersions をs にグループ化することができます。Revision
だからあなたはそのようなことをすることができます:
- ユーザーが CSV をアップロードするときは、通常どおり変更を保存するだけです
@revision.create_on_successが、インポートを行う関数にデコレーターを追加して、その関数によって行われたレコードへの変更が単一のリビジョンに保存されるようにします。
- ユーザーが「元に戻す」を押すと、最新のリビジョンに戻すだけです。
方法は次のとおりです::
@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)
ユーザーが CSV をインポートするときにのみリビジョンを作成するという事実に依存しています。つまり、他のデータのバージョン管理も計画している場合は、最新のインポートの影響を受けるレコードを取得できる何らかのフラグを実装する必要があります。次に、このフラグでレコードを取得し、最新の保存バージョンを取得して、そのバージョンが属するリビジョン全体を元に戻すことができます。このような::
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 が実際にはモデル インスタンスであると書いています。)
更新: django-reversion は積極的に維持されているため、上記のコードにあまり依存しないでください。django の管理者以外でバージョンとリビジョンを管理する方法については、 wikiを確認してください。たとえば、リビジョン コメントは既にサポートされているため、少し簡単になるかもしれません。