模型数据版本控制与审计日志:回溯任意历史快照
构建一个无侵入的混入类,自动记录每个模型实例的创建、更新、删除历史,并支持时间旅行查询。 · 难度:入门 · +10XP
审计追踪与回滚
不同于简单的日志表,本教程实现VersionedModel抽象基类,它在每次save()或delete()时,将序列化的完整快照存入VersionHistory表,包含操作者、IP和时间戳。还提供管理器as_of(date)返回特定时间点的实例状态。利用django.contrib.contenttypes泛型外键支持所有模型。最后演示如何在管理界面里对比两个版本的差异。
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
class VersionHistory(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
snapshot = models.JSONField()
timestamp = models.DateTimeField(auto_now_add=True)
class VersionedModel(models.Model):
class Meta:
abstract = True
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
VersionHistory.objects.create(
content_object=self,
snapshot=model_to_dict(self)
)