Django プロジェクトでいくつかのモデルを監査する最良の方法を見つけようとしています。いくつかのコンテキストを提供するために、Web サイトにはアカウント、プロジェクト、およびユーザーがあります。これらのいずれも、アクティブまたは非アクティブとしてマークできます。アイテムのアクティブ状態が変化したときに、それを変更した日付とスタッフのユーザー名を記録したい。
この監査の問題を解決するためのいくつかのアプローチを検討してきましたが、StackOverflow コミュニティがより良い解決策を教えてくれることを願っています。Django に組み込まれている管理インターフェース用の履歴の形式は適切ですが、十分に詳細ではありません。アイテムが変更されたことだけが通知されますが、設定された状態は通知されません。
アクションメッセージを変更し、特定のフィールドのアクションのみを記録できる場合は、Django の組み込みの履歴を使用したいと思います (他のフィールドは除外します)。
この監査の問題を解決するための次の試みは、アドオンを調べることでした。Django Reversion が最も人気があるようですが、私は Django Reversion のほとんどの機能を必要とせず、監査よりもバージョン管理を目的としています。また、AuditTrail というアドオンも 1 つ見つけましたが、これは非常に原始的なものです。
これらの可能性を試した後、独自の監査コードを作成しようとしました。アクティビティを記録する新しいモデルを作成しました。アカウント、プロジェクト、またはユーザーがアクティブ化/非アクティブ化されるたびに、エントリが書き込まれます。
class ActivityHistory(models.Model):
"""
Stores the history of when accounts, projects, and users are active.
This class uses generic relations in order to point to any model type.
For more information see: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations
"""
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
active = models.BooleanField(help_text="The target state (true if the item was activated, false if it was deactivated).")
date = models.DateTimeField(help_text="The time at which the active state was changed.")
actor = models.ForeignKey(User, help_text="The staff member who changed the active state of the account, project, or user in question.")
class Meta:
ordering = ['-date']
これに関する問題は、信号を使用して情報を記録する必要があることです。request
シグナル ハンドラー内では、HTTPオブジェクトにアクセスできません。では、どのスタッフが問題のアイテムを変更したかを記録するにはどうすればよいでしょうか?
この問題に対する実装がより簡単な他の解決策はありますか?