2010-12-07 3 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. 

그래서 내가 만들거나 유형 "푸"레코드를 업데이트 할 때마다, 나는 푸 기록의 스냅 샷을하고 FooAuditLog에 다른 항목을 추가 할 수 있습니다. 필자의 목표는 모든 Foo 레코드에 대한 완전한 개정 내역을 보유하여 시간 경과에 따라 각 레코드에 대한 모든 변경 사항을 추적 할 수 있도록하는 것입니다.

이 접근 방식의 함정은 무엇입니까? Foo와 ForeignKey 관계가있는 경우, Foo와 FooAuditLog 사이의 계단식 삭제/업데이트에 대해 걱정해야합니까?

+0

결국 무엇을 했습니까? 나는 지금 비슷한 해결책을 찾고있다. 감사! –

답변

3

Audit Trail 앱과 같은 제품을 사용하지 않는 이유는 무엇입니까? 로깅에 필요한 추상화에 상속이 실제로 어떻게 적용되는지 실제로 볼 수 없습니다. 감사 추적은 모든 활동을 패키지화하는 클래스의 간단한 선언을 사용합니다.

0

두 개의 가능한 사전 코드화 된 솔루션은 https://github.com/etianen/django-reversionhttp://code.djangoproject.com/wiki/AuditTrail입니다. 더 많은 옵션이 있습니다. https://www.djangopackages.com/grids/g/model-audit/

외래 키 참조는 특히 다 대다 (Many-To-Many) 모델의 경우 까다 롭습니다. 이전 모델이 새 테이블에 대한 제약 조건인지 여부를 결정해야합니다. 그렇지 않으면 "실행 취소"를 상당히 복잡하게 만드는 이러한 관계를 깨뜨려야합니다.

관련 문제