如何在django中进行版本控制?

时间:2013-07-25 15:02:45

标签: database django version-control orm django-models

我有不同内容的Django webapp(例如帖子,主题,评论),我想跟踪他们的历史。所以我正在尝试为“内容”创建一个“版本控制”。这就是我的做法(跳到问题的最后):

我有一个代表一个动作的模型Create_Content:有一个actor(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用于获取内容的初始作者。

webapp的所有实际内容都是由内容的派生模型实现的,这些内容由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更改为新内容(例如body的{​​{1}})。

简短结尾

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

我的问题是:

这有多糟糕?我的意思是,这张桌子可能非常大,所有动作都会触及它。

我认为我的方法是“干净”,但我很确定我正在重新发明轮子。这个特定的车轮是什么?

1 个答案:

答案 0 :(得分:2)

您可以尝试:https://bitbucket.org/emacsway/django-versioning。 Django版本允许您对存储在django模型中的数据进行版本控制,并且只存储diff而不是内容副本。 支持所有字段类型,不包括ManyToMany(当前)。

也许对您的项目有用:Django内置评论应用程序和引用对象的方式。我认为这是一个很好的,干净的方法。

物理数据库大小无关紧要。记录数无关紧要。请参阅:How big can a MySQL database get before performance starts to degrade

但保持完整的历史记录有多大用处?您可以像TimeMachine一样开始删除历史记录。每天(一周),每周(几个月)和月度记录。 Crontab或Django-Celery可帮助您删除旧历史记录。