【问题标题】:Store versioned history of Field in a Django model在 Django 模型中存储 Field 的版本历史
【发布时间】:2012-05-19 09:16:14
【问题描述】:

我有一个带有文本字段的模型,需要进行版本控制。

class Book(models.Model):
    title = models.CharField(max_length=100)
    summary = models.TextField()

预期的行为如下:

  • 如果我创建一本带有摘要的新书,文本将正常保存
  • 如果更新摘要,则需要将旧状态与版本号和时间戳一起存储在某处
  • 应该可以轻松查询当前、范围或特定版本
  • 只有字段summary 应该被版本化,而不是整个模型

我该怎么做?

【问题讨论】:

    标签: python django model version history


    【解决方案1】:

    自己搞定的。

    首先创建一个名为SummaryHistory的新模型:

    class SummaryHistory(models.Model):
        version = models.IntegerField(editable=False)
        book = models.ForeignKey('Book')
        text = models.TextField()
    
        class Meta:
            unique_together = ('version', 'book',)
    
        def save(self, *args, **kwargs):
            # start with version 1 and increment it for each book
            current_version = SummaryHistory.objects.filter(book=self.book).order_by('-version')[:1]
            self.version = current_version[0].version + 1 if current_version else 1
            super(SummaryHistory, self).save(*args, **kwargs)
    

    现在扩展初始模型如下:

    class Book(models.Model):
        title = models.CharField(max_length=100)
        summary = models.TextField()
    
        def summary_history(self):
            return SummaryHistory.objects.filter(book=self).order_by('-version')
    
        def save(self, *args, **kwargs):
            super(Book, self).save(*args, **kwargs)
            # save summary history
            summary_history = self.summary_history()
            if not summary_history or self.summary != summary_history[0].text:
                newSummary = SummaryHistory(book=self, text=self.summary)
                newSummary.save()
    

    现在,每次更新图书时,都会为特定图书创建一个新的递增版本的摘要,除非它没有更改。

    【讨论】:

    • 看起来不错,但对community 的引用似乎是错别字。如果这对您有用,请批准您自己对问题的回答! :)
    • 谢谢,我修复了错误的部分。 2天后批准工作。
    • 我建议使用 Signals 而不是覆盖 Save 方法。 docs.djangoproject.com/en/dev/topics/signals
    • 您能否在单独的答案中详细说明如何做到这一点?尚未使用信号
    • 这里讨论了何时使用信号或何时覆盖保存:stackoverflow.com/questions/5597378/…
    猜你喜欢
    • 2017-07-22
    • 2012-12-25
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2012-08-22
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多