2012-05-10 5 views
3

У меня есть модель с текстовым полем, которая должна быть версией.Магазин версии истории Field в модели 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

Я рекомендую использовать Сигналы вместо того, чтобы переопределять метод Save. https://docs.djangoproject.com/en/dev/topics/signals/ – dannyroa