2010-12-07 11 views
3

http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritanceを使用して、元のテーブルのレコードに加えられたすべての変更の完全な履歴を作成するために、既存のモデルをサブクラス化します。 Django Modelクラス継承を使用してテーブルの監査ログを作成

 
class Foo: 
    data = models.TextField() 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    def save(): 
    super(...) 
    audit = FooAuditLog.createFromFoo(self) 

class FooAuditLog(Foo): 
    history_for = models.ForeignKey(Foo) 

    def createFromFoo(foo): 
    ... #Create the auditlog entry from the original record. 

は、だから私は作成または種類の「foo」をレコードを更新するたびに、私はFooのレコードのスナップショットを取り、FooAuditLogに別のエントリを追加します。私の目標は、すべてのFooレコードの完全な改訂履歴を持つことで、時間の経過とともに各レコードに加えられたすべての変更を追跡できるようにすることです。

このアプローチの落とし穴は何ですか? Fooとの間でForeignKey関係がある場合、FooとFooAuditLog間のカスケード削除/更新について心配する必要がありますか?

+0

あなたは何をやったのですか?私は似たような解決策に取り組んでいます。ありがとう! –

答えて

3

Audit Trailアプリのようなものを使用しないのはなぜですか?継承が本当にログに必要な抽象化にどのように適合するかは実際にはわかりません。 Audit Trailは、すべてのアクティビティをパッケージ化するクラス内の単純な宣言を使用します。

0

2つの可能なプリコーディングされた解決策は、https://github.com/etianen/django-reversionおよびhttp://code.djangoproject.com/wiki/AuditTrailです。その他のオプションは、https://www.djangopackages.com/grids/g/model-audit/

にあります。特に、多対多のモデルの場合、外部キーの参照は扱いにくいです。古いモデルが新しいテーブルの制約であるかどうかを判断する必要があります。そうでなければ、 "元に戻す"を複雑にするそれらの関係を壊す必要があります。

関連する問題