【问题标题】:How to have a version control in django?如何在 django 中进行版本控制?
【发布时间】:2013-07-25 15:02:44
【问题描述】:

我有包含不同内容(例如帖子、线程、cmets)的 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 更改为新内容(例如Commentbody)。

简短的结尾

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

我的问题是:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我知道 django-versioning,但我发现它缺乏文档; Django cmets 将是deprecated。数据库大小无关紧要,但表大小很重要。是的,我可以开始删除历史记录,我肯定会这样做。不过,很好的信息,+1。
  • 啊,不推荐使用的 cmets,这对我来说是新的。明确一点:我不建议使用 dj cmets,只是看一下并复制一些设计原则。我喜欢 cmets 引用任何对象的方式。祝你好运,好问题。
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 2015-01-01
相关资源
最近更新 更多