我使用了 django-audit-log,我很满意。
Django-audit-log 可以在它自己的附加表中跟踪多个模型。所有这些表都非常统一,因此创建一个显示所有模型数据的 SQL 视图应该相当简单。
这是我为跟踪单个模型(“Pauza”)所做的工作:
class Pauza(models.Model):
started = models.TimeField(null=True, blank=False)
ended = models.TimeField(null=True, blank=True)
#... more fields ...
audit_log = AuditLog()
如果您希望在 Django Admin 中显示更改,您可以创建一个非托管模型(但这绝不是必需的):
class PauzaAction(models.Model):
started = models.TimeField(null=True, blank=True)
ended = models.TimeField(null=True, blank=True)
#... more fields ...
# fields added by Audit Trail:
action_id = models.PositiveIntegerField(primary_key=True, default=1, blank=True)
action_user = models.ForeignKey(User, null=True, blank=True)
action_date = models.DateTimeField(null=True, blank=True)
action_type = models.CharField(max_length=31, choices=(('I', 'create'), ('U', 'update'), ('D', 'delete'),), null=True, blank=True)
pauza = models.ForeignKey(Pauza, db_column='id', on_delete=models.DO_NOTHING, default=0, null=True, blank=True)
class Meta:
db_table = 'testapp_pauzaauditlogentry'
managed = False
app_label = 'testapp'
表testapp_pauzaauditlogentry
是由 django-audit-log 自动创建的,这只是创建了一个模型来显示其中的数据。加入一些粗鲁的篡改保护可能是个好主意:
class PauzaAction(models.Model):
# ... all like above, plus:
def save(self, *args, **kwargs):
raise Exception('Permission Denied')
def delete(self, *args, **kwargs):
raise Exception('Permission Denied')
正如我所说,我想您可以创建一个包含四个action_
字段和一个附加的“action_model”字段的 SQL 视图,该字段可以包含对模型本身的 varchar 引用(可能只是原始表名)。