1

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オブジェクトにアクセスできません。では、どのスタッフが問題のアイテムを変更したかを記録するにはどうすればよいでしょうか?

この問題に対する実装がより簡単な他の解決策はありますか?

4

2 に答える 2

0

DjangoのModelAdminconstruct_change_messageメソッドを再実装し、そこに機能を追加して、既存の機能を活用することができます。

ただし、これは文書化されていないため、将来のDjangoバージョンで変更される可能性があります

https://github.com/django/django/blob/master/django/contrib/admin/options.py#L665

于 2012-07-27T20:35:55.333 に答える
0

これを自分でゼロから実装するのではなく、既存のソリューションが必要なものと一致するかどうか、またはほぼ達成できるかどうかを確認することをお勧めします。フォークして、ニーズに合わせて拡張し、気に入ったら共有してください!

私は最近のプロジェクトでdjango-auditを使用しましたが、かなり満足していました (いくつかの微調整を行いました)。私が今試すもう1つの良い選択はdjango-audit-logです。

于 2012-07-27T22:28:49.567 に答える