像Git一样管理模型版本:行级差异快照与回滚
实现一个ModelVersionMixin,自动记录每次保存的diff(基于JSON Patch),支持按时间点或版本号回滚,且不影响主表性能。 · 难度:入门 · +10XP
像Git一样管理模型版本:行级差异快照与回滚
django-reversion和django-safedelete都有局限。本教程从底层实现:使用PostgreSQL的JSONB字段存储版本链,每次保存只存储与上一版本的差异(增量快照)。利用PostgreSQL的ltree实现版本树,支持分支和合并。提供restore()方法,自动应用逆patch。所有操作通过事务包裹,保证原子性。
class VersionedModel(models.Model):
version_tree = JSONField(default=dict, editable=False)
current_version = models.IntegerField(default=0)
def save_with_version(self):
old_snapshot = self.__class__.objects.get(pk=self.pk).serialize() if self.pk else None
new_snapshot = self.serialize()
patch = self.compute_patch(old_snapshot, new_snapshot)
self.version_tree[str(self.current_version+1)] = patch
self.current_version += 1
super().save()