こんにちは。sinyです。
この記事ではDjangoのモデルで実装したテーブルの履歴管理機能を実装する方法をご紹介します。
テーブルの履歴情報を管理したり、ロールバック機能を利用したいという方には大変便利な機能だと思いますので試してみてください。
django-reversionとは?
django-reversionというモジュールを使うと、Djangoで実装したモデル(テーブル)の履歴管理を実装することができます。
具体的には、以下のような機能を実装することができます。
・モデルインスタンスの履歴内の任意の時点にロールバック
・削除されたモデルインスタンスを回復(テーブルの復元)
・簡単な管理統合
django-reversionの実装手順
pip install django-reversion
続いて、settings.pyの INSTALLED_APPSに「 'reversion' 」を追加します。
※なお、Djangoのプロジェクト名を「project」、アプリケーション名は「app」とします。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app', 'reversion', #追加 ]
続いてマイグレーションを実行します。
python manage.py migrate
最後にAdminサイトの設定を行います。
アプリケーション配下のadmin.pyを少しカスタマイズします。
ここでは、Bookというテーブルクラスを例に記載しています。
通常テーブルをadminサイトに表示するには、admin.ModelAdminを使って以下のように定義します。
from django.contrib import admin from .models import Book class BookAdmin(admin.ModelAdmin): list_display=('pk','word', 'isbn', 'salesDate', 'title') admin.site.register(Book, BookAdmin)
上記に以下を追加し、
from reversion.admin import VersionAdmin
admin.ModelAdmin ⇒ VersionAdmin に変更します。
変更後のadmin.pyは以下のようになります。
from django.contrib import admin from .models import Book from reversion.admin import VersionAdmin #追加 class BookAdmin(VersionAdmin): #変更 list_display=('pk','word', 'isbn', 'salesDate', 'title') admin.site.register(Book, BookAdmin)
以上で設定は完了です。
続いて、初期変更履歴のバージョンを生成するために以下のコマンドを実行します。
python manage.py createinitialrevisions app.Book --comment="Initial revision."
パラメータの指定の仕方は以下の通りです。
python manage.py createinitialrevisions [アプリケーション名].[テーブルクラス名] --comment="Initial revision."
上記コマンドを実行すると、下記画面のようにテーブルレコードに対して履歴情報のInitial情報が生成されます。
履歴管理とレコードの復元
adminサイトにログオンしてテーブルを参照すると以下のように「RECOVER DELETED」というボタンが追加されています。
このボタンを押すと、過去にレコードを削除した履歴情報が表示されます。
復元したい行をクリックすると削除した時点のレコード情報が表示されるので、「保存」ボタンを押すとレコードが復元されます。
続いてテーブルレコードの変更履歴ですが、テーブルのレコード画面を開くと、以下のように「履歴」ボタンが追加されているのでクリックします。
以下の通り、レコード毎に変更履歴を保持していて、復元したい日時の行をクリックして、保存ボタンを押すとその時点のレコード内容に復元することができます。
最後に、履歴情報をクリアする方法をご紹介します。
#全テーブルの履歴を全削除 python manage.py deleterevisions #過去30日間の変更を保存する python manage.py deleterevisions your_app.YourModel --days = 30 #各項目について30個の最新の変更を保持します。 python manage.py deleterevisions your_app.YourModel --keep = 30 #過去30日間のもの、およびそれ以前の変更からのものを少なくとも3つ保持します。 python manage.pydeleterevisions your_app.YourModel --keep = 3 --days = 30
以上、「Djangoでテーブルの履歴管理機能を実装する方法」でした。