【Django】テーブルの履歴管理を実装する完全ガイド|django-reversion で変更履歴・ロールバック対応

スポンサードリンク



Django · Audit Log · django-reversion で履歴管理

歴管理(誰がいつどのレコードをどう変更したか)は、業務系アプリでは必須機能です。自前で実装するとモデル定義が膨らみ、保守も大変ですが、django-reversion を使えば既存モデルに数行の登録コードを足すだけで、変更履歴の自動記録・任意時点へのロールバックが可能になります。本記事では django-reversion の導入から、admin での履歴閲覧、過去バージョン復元までの実装手順を解説します。

この記事ではDjangoのモデルで実装したテーブルの履歴管理機能を実装する方法をご紹介します。

テーブルの履歴情報を管理したり、ロールバック機能を利用したいという方には大変便利な機能だと思いますので試してみてください。

user@sinyblog:~/article 01_django_reversion.mddjango-reversionとは?

django-reversionというモジュールを使うと、Djangoで実装したモデル(テーブル)の履歴管理を実装することができます。

具体的には、以下のような機能を実装することができます。

・モデルインスタンスの履歴内の任意の時点にロールバック

・削除されたモデルインスタンスを回復(テーブルの復元)

・簡単な管理統合

user@sinyblog:~/article 02_django_reversion.mddjango-reversionの実装手順

django-reversionの実装手順は非常に簡単です。
まずは、pipでモジュールをインストールします。
default


pip install django-reversion

 

続いて、settings.pyの INSTALLED_APPSに「 'reversion' 」を追加します。

※なお、Djangoのプロジェクト名を「project」、アプリケーション名は「app」とします。

default


INSTALLED_APPS = [				

'django.contrib.admin',				

'django.contrib.auth',				

'django.contrib.contenttypes',				

'django.contrib.sessions',				

'django.contrib.messages',				

'django.contrib.staticfiles',				

'app',				

'reversion',  #追加		

]				

 

続いてマイグレーションを実行します。

default


python manage.py migrate

 

最後にAdminサイトの設定を行います。

アプリケーション配下のadmin.pyを少しカスタマイズします。

ここでは、Bookというテーブルクラスを例に記載しています。

通常テーブルをadminサイトに表示するには、admin.ModelAdminを使って以下のように定義します。

python


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)

 

上記に以下を追加し、

default


from reversion.admin import VersionAdmin

 

admin.ModelAdmin ⇒ VersionAdmin に変更します。

変更後のadmin.pyは以下のようになります。

default


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


python manage.py createinitialrevisions app.Book --comment="Initial revision."

 

パラメータの指定の仕方は以下の通りです。

 

python manage.py createinitialrevisions [アプリケーション名].[テーブルクラス名] --comment="Initial revision."

上記コマンドを実行すると、下記画面のようにテーブルレコードに対して履歴情報のInitial情報が生成されます。

user@sinyblog:~/article 03_section_3.md履歴管理とレコードの復元

adminサイトにログオンしてテーブルを参照すると以下のように「RECOVER DELETED」というボタンが追加されています。

このボタンを押すと、過去にレコードを削除した履歴情報が表示されます。

復元したい行をクリックすると削除した時点のレコード情報が表示されるので、「保存」ボタンを押すとレコードが復元されます。

続いてテーブルレコードの変更履歴ですが、テーブルのレコード画面を開くと、以下のように「履歴」ボタンが追加されているのでクリックします。

以下の通り、レコード毎に変更履歴を保持していて、復元したい日時の行をクリックして、保存ボタンを押すとその時点のレコード内容に復元することができます。

最後に、履歴情報をクリアする方法をご紹介します。

python


#全テーブルの履歴を全削除

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

 

 上記の通り、履歴情報のクリアは全テーブル or テーブル単位に実行できます。

 

以上、「Djangoでテーブルの履歴管理機能を実装する方法」でした。

 

おすすめの記事