Я использовал 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')
Как я уже сказал, я думаю, вы могли бы создать представление SQL с четырьмя полями action_
и дополнительным полем 'action_model', которое могло бы содержать ссылки varchar на саму модель (может быть, просто исходное имя таблицы).