2012-05-10 8 views
3

バージョン管理が必要なテキストフィールドを持つモデルがあります。フィールドのバージョン履歴をDjangoモデルに保存します

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

次のように期待される動作は以下のとおりです。

  • 私が要約して新しいブックを作成した場合、テキストは要約が更新されている場合は、古い状態はする必要が正常に
  • 保存されます。バージョン番号とタイムスタンプのある場所に保存する
  • 現在のバージョン、特定のバージョンまたは特定のバージョンを簡単に照会することが可能です
  • フィールD summaryは全体ではなく、モデル、バージョン管理されなければならない

私はこれをどのようにしたらよいでしょうか?

答えて

6

自分で手に入れました。

まずSummaryHistoryと呼ばれる新しいモデルを作成:

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() 

を今、あなたが本を更新するたびに、要約の新しい増分バージョンを次のように今、初期モデルを拡張

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) 

を変更されていない限り、特定の本が作成されます。

+0

「コミュニティ」への参照は誤植のように見えます。これがうまくいく場合は、あなた自身の質問への回答を承認してください! :) – jathanism

+0

ありがとう、私は間違った部分を修正しました。承認は2日後に機能します。 – Alp

+0

Saveメソッドをオーバーライドする代わりにSignalsを使用することをお勧めします。別の回答でこれを行う方法については、https://docs.djangoproject.com/en/dev/topics/signals/ – dannyroa

関連する問題