如何在Django中使用版本控制?

9
我有一个Django Web应用程序,其中包含不同的内容(例如帖子、主题、评论),我想要追踪它们的历史记录。因此,我试图为“内容”创建“版本控制”。这是我的做法(关于问题,请跳到结尾):
我有一个模型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的新内容(例如Commentbody)。

简要结论

我意识到每个用户操作都将在Create_Content表中有一个条目。

我的问题是:

这样做有多糟糕?我的意思是,这个表可能非常大,并且所有操作都将命中它。

我认为我的方法很“清洁”,但我相信我正在重新发明轮子。这个具体的轮子是什么?


1
Django-reversion怎么样?https://github.com/etianen/django-reversion - Bibhas Debnath
1个回答

4
您可以尝试使用Django-Versioning:https://bitbucket.org/emacsway/django-versioning。 Django-Versioning允许您对存储在Django模型中的数据进行版本控制,并仅存储差异,而不是内容副本。 支持除ManyToMany之外的所有字段类型(目前)。
也许对您的项目有用:Django内置评论应用程序以及引用对象的方式。我认为这是一种不错和干净的方法。
物理数据库大小并不重要。记录数也不重要。请参见:MySQL数据库在性能开始下降之前可以变得多大? 但是,保留完整历史记录有多有用呢?您可以开始删除类似于TimeMachine的历史记录。每天保留一次(一周),每周保留一次(几个月),每月记录一次。Crontab或Django-Celery可帮助您删除旧的历史记录。

1
我知道django-versioning,但是我发现它缺乏文档;Django comments将会被弃用。数据库大小无关紧要,但表格大小很重要。是的,我可以开始删除历史记录,这是一定会做的。尽管如此,这是有价值的信息,点赞。 - Jorge Leitao
1
啊,弃用的注释,这对我来说是新鲜事。只是为了明确:我不建议使用dj注释,只是看看它并复制一些设计原则。我喜欢注释引用任何对象的方式。祝好运,问题很好。 - allcaps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接