9

バージョン管理が必要なテキスト フィールドを持つモデルがあります。

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

予想される動作は次のとおりです。

  • あらすじ付きの本を新規作成したら本文は普通に保存されます
  • 概要が更新された場合、古い状態をバージョン番号とタイムスタンプとともにどこかに保存する必要があります
  • 現在、範囲、または特定のバージョンを簡単に照会できる必要があります
  • summaryモデル全体ではなく、フィールドのみをバージョン管理する必要があります

どうすればいいですか?

4

1 に答える 1

11

自分で手に入れました。

まず、次のような新しいモデルを作成します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()

これで、本を更新するたびに、変更されていない限り、特定の本の要約の新しい増分バージョンが作成されます。

于 2012-05-10T18:58:15.847 に答える