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

Jor*_*tao 5 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')
Run Code Online (Sandbox Code Playgroud)

由于无法更改历史记录,因此仅保存一次。

我定义的内容有:

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
Run Code Online (Sandbox Code Playgroud)

last_edit最后一个动作在哪里执行,first_edition我用来获取内容的最初作者。

该Webapp的所有实际内容均由Content的派生模型实现,该模型由的派生模型创建/编辑Create_Content。例如,

class Comment(Content):
    post = models.ForeignKey(Post, related_name="comment_set")
    body = models.TextField()
Run Code Online (Sandbox Code Playgroud)

是在保存期间创建的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的新内容(例如bodyComment)。

简短的结局

我意识到,每个用户操作都会在的表中有一个条目Create_Content

我的问题是:

这有多严重?我的意思是,这张桌子可能很大,所有动作都会达到目的。

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

all*_*aps 5

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

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

物理数据库大小并不重要。记录的数量并不重要。请参阅:MySQL 数据库在性能开始下降之前可以达到多大

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