我有一个Django Web应用程序,其中包含不同的内容(例如帖子、主题、评论),我想要追踪它们的历史记录。因此,我试图为“内容”创建“版本控制”。这是我的做法(关于问题,请跳到结尾):
我有一个模型Create_Content,表示一个动作:有一个演员(editor),一组修改(edition),时间戳和它所操作的内容。
我有一个模型Create_Content,表示一个动作:有一个演员(editor),一组修改(edition),时间戳和它所操作的内容。
class Create_Content(models.Model):
editor = models.ForeignKey('User')
edition = models.TextField() # pickled dictionary
date = models.DateTimeField(auto_now_add=True)
content = models.ForeignKey('Content')
历史记录无法更改,因此只保存一次。
我将内容定义为:
class Content(models.Model):
last_edit = models.ForeignKey(Create_Content, related_name='content_last_id')
first_edit = models.ForeignKey(Create_Content, related_name='content_first_id')
def author(self):
return self.first_edit.editor
这里的last_edit
代表的是最后一次编辑操作,而first_edition
则用于获取内容的初始作者。
整个Web应用的实际内容都是由Content的派生模型实现的,这些模型是由Create_Content
的派生模型创建/编辑的。例如,
class Comment(Content):
post = models.ForeignKey(Post, related_name="comment_set")
body = models.TextField()
Create_Comment(Create_Content)
保存时创建(实际上,Create_Content
的所有子类都是代理)。
例如,用户编辑是Create_Content
的子类的实例(例如Edit_Comment(Create_Content)
),在save()
期间,使last_edit
指向self
并更新实际内容(例如Edit_Comment.body
)。
最后,我正在为数据库执行简化版本的Git:
Create_Content
是提交(将完整状态存储在self.edition
中)。Content
是特定的分支+工作目录(last_edit
是指针),- 用户编辑将分支向前移动并更改
Content
的新内容(例如Comment
的body
)。
简要结论
我意识到每个用户操作都将在Create_Content
表中有一个条目。
我的问题是:
这样做有多糟糕?我的意思是,这个表可能非常大,并且所有操作都将命中它。
我认为我的方法很“清洁”,但我相信我正在重新发明轮子。这个具体的轮子是什么?