2012-05-10 41 views
3

我有一個帶有文本字段的模型,需要進行版本控制。在Django模型中存儲字段的歷史版本

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

預期的行爲如下:

  • 如果我創建一個新的書摘要,文本將正常如果彙總更新保存
  • ,舊的國家需要可以用一個版本號和時間戳
  • 它應該很容易可以查詢當前,一系列或特定版本
  • 只有FIEL存儲的地方d summary應該版本化,不是整個型號

我應該怎麼做?

回答

6

明白了。

首先創建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() 

現在,每次更新一本書,總結新增加的版本因爲具體的書會被創建,除非它沒有改變。

+0

看起來不錯,但對「社區」的引用看起來像一個錯別字。如果這適用於您,請批准您自己的問題答案! :) – jathanism

+0

謝謝,我修正了錯誤的部分。 2天后審批工作。 – Alp

+0

我推薦使用Signals而不是重寫Save方法。 https://docs.djangoproject.com/en/dev/topics/signals/ – dannyroa

相關問題