8

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

我有一个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我用来获取内容的初始作者。

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新内容(例如)。bodyComment

简短的结尾

我意识到每个用户操作都会在Create_Content.

我的问题是:

这有多糟糕?我的意思是,这张桌子可以很大,所有的动作都会打到它。

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

4

1 回答 1

4

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

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

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

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

于 2013-07-25T15:31:22.447 回答