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

标签 database django version-control orm django-models

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

我有一个模型 Create_Content 代表一个 Action :有一个 Actor (编辑器),一组修改(版本),一个时间戳及其作用的内容:

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 的所有实际内容都是由 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 表中有一个条目。

我的问题是:

发生这种情况有多糟糕?我的意思是,这张 table 可能很大,所有的 Action 都会碰到它。

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

最佳答案

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

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

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

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

关于database - 如何在 Django 中进行版本控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17861693/

相关文章:

version-control - 在Eclipse CDT中具有多个二进制文件的项目

SQL 足球积分表最近 5 场比赛

php - 数据库查询优化(MySql)

sql - 如何在多个数据库表上创建单个触发器

python - 用户信息未保存

jquery - Django 从数据库自动完成

svn - 源代码控制分支的不同方法

php - "WHERE column IS NOT NULL"与 Kohana v3 查询生成器

python - django 应用程序中模型的自连接是否是可接受的模式?

security - Git:删除存储库中文件的所有修订,并替换为新文件