在Django模型中存储Field的版本化历史记录

Alp*_*Alp 6 python django history model version

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

class Book(models.Model):
    title = models.CharField(max_length=100)
    summary = models.TextField()
Run Code Online (Sandbox Code Playgroud)

预期的行为如下:

  • 如果我使用摘要创建新书,则文本将正常保存
  • 如果更新摘要,则需要将旧状态存储在具有版本号和时间戳的某个位置
  • 应该可以轻松查询当前,一系列或特定版本
  • summary应对字段进行版本控制,而不是整个模型

我该怎么办?

Alp*_*Alp 9

得到它自己.

首先创建一个名为的新模型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)
Run Code Online (Sandbox Code Playgroud)

现在扩展初始模型如下:

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

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